【问题标题】:ASP.NET Identity - Confusion about [Authorize] And RoleManagerASP.NET Identity - 关于 [Authorize] 和 RoleManager 的困惑
【发布时间】:2014-04-20 08:04:25
【问题描述】:

我一直在关注这篇关于为新的 ASP.NET 身份系统创建自定义“存储提供程序”的帖子,到目前为止,它已被证明非常有用;

Creating a custom MySQL Identity Provider

我没有使用 MySQL,我使用的是 RavenDB - 是的,我已经查看了可用的 RavenDB 身份提供程序 - 这不是我的问题。我的问题来自IUserRoleStore<IdentityUser>,然后是IdentityRole,以及RoleStore

我看到他们被创建了——我什至看到他们如何访问数据以查看用户是否在某个角色中,等等。但后来,我只看到了这个 ..

[Authorize(Roles = "Admin")]
public AccountController : Controller { 
    /// ... etc .etc..
}

这是我彻底迷路的地方。我查阅了几十篇关于新的 ASP.NET 身份系统的教程,但我无法弄清楚在什么时候某些东西与 AuthorizeAttribute 相关联。它怎么知道使用我制作的RoleStore?它怎么知道使用我制作的IdentityRole?它在验证什么?

这些都是我在任何地方都找不到的东西,这让我有点发疯。我发现的所有东西都一直插入到实体框架中,这不是我想要使用的——它就是开箱即用的方式,而且它们似乎停止了,没有告诉你如何确保Authorize像你想要的那样工作它到。

【问题讨论】:

    标签: asp.net asp.net-identity


    【解决方案1】:

    实际上比这简单一点。当用户登录时,AccountController 中的这些行会创建一个 ClaimsIdentity 并且 auth 中间件会设置一个 cookie...

    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
    

    创建ClaimsIdentity 时从数据库中读取角色信息。身份(包括角色)被序列化并加密到 cookie 中。在随后的请求中,ClaimsIdentity 被中间件从 cookie 中解密和反序列化。身份附加到线程,这就是AuthorizeAttribute 用来确定用户是否处于角色中的内容。您还可以在控制器中使用User.Identity 以编程方式访问ClaimsIdentity

    【讨论】:

    • 伙计,我不知道你们是如何跟上这一切的。我阅读了所有我能阅读的博客,但即使有我所有的经验,这一切仍然让我难以想象。
    • @Ciel - 它有助于使用类似 Resharper 或类似的东西对代码进行逆向工程并遍历它.. 或查看 codeplex 上的 aspnetwebstack 源代码。
    【解决方案2】:

    Authorize 属性对 ASP.NET 身份或任何其他身份系统一无所知。它只适用于 MVC 框架为您设置的 IPrincipalIIdentity 接口。

    ASP.NET Identity 使用一个ClaimsIdentity 对象,它实现了IIdentity

    因此,框架通过 UserManager 创建了一个身份验证票证。当页面加载时,它会加载此身份验证票证,对其进行解密,并创建必要的主体以及身份和角色对象。

    然后,Authorize 属性基本上只是在您说时检查User.IsInRole("Blah")

    [Authorize(Roles="Blah")]

    【讨论】:

    • @Ciel - 好吧,我不会说“字面意思”,如果您了解 MVC(或 asp.net)管道,那么它是有道理的。要理解的关键点是 Authorize 不关心您使用哪个身份系统,它对 ASP.NET 的内置接口是通用的。 “魔法”发生在页面加载时身份的连接方式。
    • 大声笑,我有点讽刺。不过看起来确实有点神奇。
    • 伙计,在进一步探索之后,整个事情真是太棒了。说出你对微软的看法,人们经常抨击他们——而且很多人抨击 ASP.NET,但身份系统的整个策略非常令人难以置信。
    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 2011-12-13
    • 2017-12-04
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多