【问题标题】:AuthorizeAttribute with ASP.NET IdentityAuthorizeAttribute 与 ASP.NET 标识
【发布时间】:2014-01-26 22:25:59
【问题描述】:

我有一个受[Authorize] 属性保护的控制器。

这很好用(如果我没有登录,我会被送回登录),但我希望为这个属性添加一些角色,我已经读过它可以做类似[Authorize(Roles = "Customer"] 的事情但是当我我会立即返回到我的应用程序的登录页面吗?

这个Roles 覆盖是否不适用于新的 ASP.NET 标识?在我创建用户时,我通过以下代码将用户添加到:

var user = new ApplicationUser {UserName = model.Username};
var result = UserManager.Create(user, model.Password);
if (result.Succeeded)
{
    UserManager.AddToRole(user.Id, "Customer");
    SignIn(user, false);

    return RedirectToAction("Done");
}

根据数据库,用户是这个角色。为什么这不起作用?我是否缺少配置或某种配置?

【问题讨论】:

  • 您确定该用户是客户角色吗?
  • 是的,客户来自我使用的常量
  • 我的意思是,当您转到项目 -> ASP.NET 配置时,转到安全选项卡,然后单击创建/管理角色。检查您的角色。然后转到用户并检查您的用户。请务必查看 Microsoft 音乐演示的第 7 部分asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-7
  • 那是旧的会员资格 - 我正在使用 ASP.NET 身份?
  • 对不起,你是对的。请看我的回答(我是关于写的)。

标签: c# asp.net-mvc asp.net-identity asp.net-roles


【解决方案1】:

我将回答我自己的问题。

这不起作用的原因(数小时的挖掘)是因为我的上下文有以下内容:

Configuration.ProxyCreationEnabled = false;

这使得延迟加载被禁用,因此在加载用户时不包括角色!

因此解决方法是启用此功能或删除该行。

更新:2015-05-01

这是一个错误,已在 2.0.0-alpha1 版本中修复。因此,以后不再需要此解决方法,并且无论此设置如何,都会加载角色。

Does Identity Owin require LazyLoading?

【讨论】:

  • 哇!遇到同样的问题,昨晚整晚都在试图弄清楚为什么没有为用户角色加载声明!很好的收获,谢谢!
  • 不错的发现。也让我挠了好几个小时。我不确定为什么它需要依赖延迟加载来为用户获取角色。希望看到对此有更深入的见解。有人吗?
  • 我无法使用最新版本的 ASP.Net Identity 复制此行为。我有一个不同的问题,这导致我写这篇文章,但是,无论是 Configuration.ProxyCreationEnabled = false,还是切换 Configuration.LazyLoadingEnabled 都没有任何区别。它在两种情况下都加载角色。
  • 原来这是个bug,后来修复了。因此,我们不再需要这样的解决方法。 stackoverflow.com/questions/20868836/…
  • @janhartmann 非常感谢您的帖子!这是我发现之路的重要组成部分。
【解决方案2】:

我写了一个样本来测试它,效果很好。所以我认为有 2 点
1.你的cookie没有保存到浏览器
2.你的cookie没有角色信息

检查你的cookie,是否有一个名为“.AspNet.ApplicationCookie”的cookie(默认名称)
如果不是这样,请检查您的浏览器是否允许写入 cookie,或者您编写 cookie 的代码
如果存在,你可以创建一个类扩展

ISecureDataFormat<AuthenticationTicket>  

和配置

app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            TicketDataFormat=new T()

        });

new T() 是类
在这堂课中你需要做的

public string Protect(AuthenticationTicket data)

public AuthenticationTicket Unprotect(string protectedText)

这是关于序列化的一些事情
可以设置断点,查看数据,
在 data.Identity.Claims (a IEnumerable) 中应该有一个包含您的角色信息的声明

【讨论】:

    【解决方案3】:

    查看此答案:ASP.NET Identity check user roles is not working

    在您的案例中,在检查案例时,比较 IdentityRole 记录和授权属性的案例。不要和UserManager.AddToRole(user.Id, "Customer");比较

    【讨论】:

      【解决方案4】:

      在我的情况下,它与 AspNet Identity 配合得很好。你确定你:

      • 没有自定义授权过滤器或没有做对吗?
      • 尚未在 web.config 中重新配置身份验证/授权?
      • 在 AspNet Identity 表中有正确的条目:AspNetUsers、AspNetRoles、AspNetUserRoles(角色存在且用户拥有)?

      【讨论】:

      • 授权在 web.config 中应该是怎样的?除了错误处理,我没有使用其他过滤器。
      • 您的 web.config 中是否有任何名为身份验证或授权的元素,它们的值是什么?
      • 不,没有。我什至尝试将默认值: 放在一起 - 也没有任何运气。
      • 最后检查:表数据条目(服务器资源管理器 -> 数据连接 -> DefaultConnection [可能是其他] -> 有 AspNet Identity 表)。如果有正确的匹配 - 不看代码就不知道。
      • 是的,他们在那里。也充满了正确的数据和正确的关系。我开始想也许当用户被加载时,它的角色没有被填充。延迟加载。但我还没有将我的应用程序配置为不使用 LL
      【解决方案5】:

      像这样创建一个角色:

      RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
      var roleresult = RoleManager.Create(new IdentityRole(roleName));
      

      然后,像这样添加一个用户:

      var currentUser = UserManager.FindByName(user.UserName); 
      var roleresult = UserManager.AddToRole(currentUser.Id, "Superusers");
      

      如果这对你有用,请告诉我。

      【讨论】:

      • 这已经是我创建角色并将用户添加到角色的方式,问题是对角色的检查是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2022-01-06
      • 2019-08-06
      • 2015-06-16
      • 2015-10-20
      相关资源
      最近更新 更多