HttpContext.Current.User.IsInRole(roleName)始终返回false

时间:2009-08-14 15:12:26

标签: asp.net-mvc

我正在努力为ASP.NET MVC App添加授权,并且遇到了障碍。我终于能够将我们的自定义成员资格提供程序连接起来,并为该应用程序进行身份验证。现在,正如预期的那样,如果我将[Authorize]属性添加到我的控制器,则必须对用户进行身份验证才能查看该页面。我还成功测试了[Authorize(Users =“{userName}”)],它也可以将页面限制为该特定用户。

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

我已经确认我正在使用的用户具有我尝试授权的角色。我还在WebForms应用程序中测试了这些用户,这些应用程序限制了相同角色的页面访问,并且工作正常。我认为我在某处设置了错误或者遗漏了一些简单的东西,但是在整个上午搜索之后,我没有找到任何让我更接近解决方案的东西,所以我希望有人可以帮助我。< / p>

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

我遇到了与OP类似的问题。虽然这是一个老帖子,我想我会把对我有用的东西。我发现在web.config中禁用了角色提供程序。我将enabled设置为true,它解决了我的问题。

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

答案 2 :(得分:1)

一个古老的话题,但我遇到了类似的问题,原因在于:

FormsAuthentication.SetAuthCookie(string, bool)

我使用用户的身份令牌(Guid)作为第一个参数,因为我使用的代码使用了名为token的变量,但实际上它必须是有效的用户名。我在使用分析器并手动运行aspnetdb的存储过程后发现了这一点。 MSDN文档也证实了这一点。

尽管[Authorize(Roles="rolename")]有效,但即使用户担任该角色,也会导致[Authorize]失败。

答案 3 :(得分:0)

尝试清除浏览器Cookie缓存。我花了一些时间来解决类似的问题,清理我的饼干解决了这个问题。

答案 4 :(得分:0)

如果其他人发现这个问题:

我遇到了类似的问题,问题是域组中的空格。使用任何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(),这应该可以更好地处理包含空格的域组。