ASP.NET身份 - 关于[授权]和RoleManager的困惑

时间:2014-04-20 08:04:25

标签: asp.net asp.net-identity

我一直在关注创建自定义"存储提供商"对于新的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像你想要的那样工作。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

ASP.NET Identity使用ClaimsIdentity对象,该对象实现IIdentity

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

然后,当您说

时,Authorize属性基本上会检查User.IsInRole("Blah")

[Authorize(Roles="Blah")]