HttpContext.Current.User.IsInRole(roleName)总是返回false

问题描述:

我正在向ASP.NET MVC应用程序添加授权,并且遇到了路障。我终于能够连接我们的自定义会员提供商并获得应用程序的身份验证。现在,正如所料,如果我将[授权]属性添加到我的控制器,用户必须通过身份验证才能查看页面。我也成功地测试了[Authorize(Users =“{userName}”)],它也可以将页面限制为特定用户。HttpContext.Current.User.IsInRole(roleName)总是返回false

问题是[Authorize(Roles =“{RoleName}”)]似乎并没有像我期待的那样工作。如果我将该属性添加到控制器,则只要尝试访问相应的页面,我就会重定向到我们的登录页面。如果用户没有所需的角色,这就是我期望发生的情况,但即使用户具有该角色也会发生这种情况。我已经在View,Controller和Helper方法中检查了User.IsInRole(“{roleName}”)和HttpContext.Current.User.IsInRole(“{roleName}”),并且总是返回'False'。

我已验证我正在使用的用户具有我想要授权的角色。我还在WebForms应用程序中测试了这些用户,该应用程序通过相同的角色限制页面访问,并且工作正常。我认为我在某处安装了某些东西,或者错过了一些简单的东西,但是在整个上午搜索后,我没有发现任何让我更接近解决方案的东西,所以我希望有人能帮助我。

+0

嘿,你可以编辑你的答案,告诉我们配置是什么 - 可能在未来帮助其他人。 – sirrocco 2009-08-19 22:44:49

+0

sirrocco - 配置设置特定于我们的实施和环境,因此它们不会对任何人有任何用处。 – Hamman359 2009-08-20 14:48:35

+0

您的评论促使我仔细检查我的web.config,并且发现roleManager节点已启用=“false”。我只是想让人们知道,如果它被禁用,它会返回IsInRole的false,而不是像您期望的那样返回某种异常。 – 2012-01-06 23:04:35

首先:使用探查器并执行HttpContext.Current.User.IsInRole(“{roleName}”)行时,检查sql查询是什么。

如果它没有进行查询,那么你可能有cacheRolesInCookie =“true”,IsInRole将检查用户数据的FormsAuthenticationTicket。确保在创建FormsAuthenticationTicket时,将userdata参数设置为用户角色的逗号分隔字符串。

+0

谢谢,这并没有解决问题,但它确实导致我走上了一条最终的道路。事实证明,有一些额外的配置设置需要让角色提供者完全工作,没有人打扰告诉我。一旦我偶然发现了这些,一切都“神奇地”开始发挥作用。 – Hamman359 2009-08-19 20:09:22

+1

那是什么,我有同样的问题,你能不能让我知道 – 2014-05-11 13:27:24

尝试清除浏览器Cookie缓存。我花了一段时间在类似的问题上敲了敲头,清理出我的饼干解决了问题。

如果别人发现了这个问题:

我遇到过类似的问题,这个问题是域组中的空间。使用任何HttpContext.Current.User返回,调用IsInRole()似乎使用不包含空格的Windows 2000以前的组名进行比较。

在我的情况下,剥离传递给IsInRole()的组名中的空格修复了这个问题。

这里有一个漂亮的扩展方法来做到这一点:

/// <summary> 
/// Removes all spaces from a string 
/// </summary> 
/// <param name="value">The string</param> 
/// <returns>The string without spaces</returns> 
public static string StripSpaces(this string value) 
{ 
    // my test using both long and short strings showed StringBuilder 
    // to be slightly faster at this than string.Replace() 

    StringBuilder b = new StringBuilder(value); 

    b.Replace(" ", string.Empty); 

    return b.ToString(); 
} 

另外,您可以使用System.DirectoryServices.AccountManagement.UserPrincipal并调用IsMemberOf()这应该包含空格的域组更好地工作。

我也有类似的问题,因为OP。虽然这是一个旧帖子,但我认为我会为我工作。我发现在web.config中禁用了角色提供程序。我设置启用为真,它解决了我的问题。

<configuration> 
    <system.web> 
     <roleManager enabled="true" defaultProvider="myRoleProvider"> 
+0

是的,大声笑,这是做到了。所有这些复杂的解决方案,它变成了一个简单的开关。谢谢。 – 2013-02-07 23:01:15

一个老话题了一点,但我也有类似的问题,原因是:

FormsAuthentication.SetAuthCookie(string, bool) 

我用的是用户的身份标识(GUID)作为第一个参数,因为代码我正在使用名为token的变量,但实际上它必须是有效的用户名。在使用探查器并手动运行aspnetdb存储的proc后,我发现了这一点。 MSDN文件也证实了这一点。

这也会导致[Authorize(Roles="rolename")]失败,即使用户在角色中,但[Authorize]的作品。