0

大家好

我有一个使用 ASP.NET Identity 2.0 的项目。在这个项目中,我遵循洋葱架构。这些层是:

1.UI:没有引用 Owin 或 ASP.Net Identity

2.AuthenticationService:包含asp.net身份usermanager的包装器。这个包装器实现了一个位于Bal层的接口。这个层还包含我的自定义UserStore。

3.Dal:DbContext 就在这里。

4.Bal:包含 Domaine 实体和接口。不引用 Owin 或 ASP.NET 标识或其他任何内容。

5.DependencyResolver:Owin Startup 在这里加上一些 Ninject 模块和 NinjectWebCommon。所以我正在使用 Ninject。

直到现在一切都很好。用户很高兴创建帐户,并且他们可以随时登录/注销/管理。现在面临的问题是授权(Role="rolename")。它只是不起作用。

[Authorize(Users="pedro")]
[Authorize]

这两个作品

[Authorize(Roles="Admin")]

这是一个没有。

在我的数据库中,我有属于角色管理员的用户。我不确定为什么这不起作用。mybe 因为我将所有身份验证内容移到另一层,所以 IPrincipal.IsInRole(string role) 无法弄清楚如何再检查一下。

正在创建自定义 Authorize 属性或创建一些扩展。但我决定先征求你的意见。

感谢您的时间

4

1 回答 1

1

好吧,我在这里回答我自己的问题。

确实问题是因为方法 User.IsInRole(或 IPrincipal.IsInRole,因为 User 是 IPrincipal)。使用反射器检查 AuthorizeAttribute 的代码显示该属性使用 IsInRole 方法检查经过身份验证的用户是否在角色 X 或 Xs 中。但是这里有另一个问题。为什么它不能这样做,我的意思是为什么它找不到输出用户是否属于特定角色。

问题来自为用户生成的 Cookie。因为角色与他们需要存在的 Cookie 相关联,因此 IsInRole 可以找到它们,这就是我犯错误的地方。我将身份验证和授权移到了其他地方,但我没有t 提供一种将角色信息嵌入 cookie 中的方法,因此 IsInRole(来自用户或来自角色)无法找到它们,以便授权属性按照我的意愿完成它的工作。所以好消息是我只需要以某种方式在 cookie 中插入角色。

更好的消息是:现在使用的 ASP.NET Identity 支持声明,并且在 4.5 中,GenericPrincipal 派生自 ClaimsPrincipal,而 ClaimsPrincipal 又派生自 IPrincipal,所以我可以使用声明而不是旧时尚角色(如果我们愿意,我们仍然可以使用它至)。

好吧。如果有人遇到同样的问题,我建议如下:

1.Authorize 属性需要cookie包含您尝试依赖的所有信息(角色,用户名)。

2. 使用 thinktecture Nuget 而不是 Authorize 或 ClaimsPrincipalPermission 属性,这可以为您提供两者的优点。

3.Learn About Claims.yo永远不会后悔。

于 2014-11-19T05:46:02.610 回答