使用洋葱架构中的角色进行授权

时间:2014-11-16 06:03:38

标签: asp.net-mvc asp.net-identity owin onion-architecture

大家好

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

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

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

3.Dal:DbContext住在这里。

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

5.DependencyResolver:Owin Startup加上一些Ninject Modules和NinjectWebCommon.So am Using Ninject。

直到现在一切都很好。用户很乐意创建帐户,他们可以随时登录/注销/管理。现在面临的问题是授权(角色="角色名称")。它只是不起作用。

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

这两项工作

[Authorize(Roles="Admin")]

这是一个没有。

在我的数据库中我有属于Role Admin的用户。我不知道为什么这不起作用.mybe因为我将所有身份验证内容移动到另一层,所以IPrincipal.IsInRole(字符串角色)可以& #39;弄清楚如何检查这个。

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

感谢您的时间

1 个答案:

答案 0 :(得分:1)

那么我在回答我自己的问题。

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

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

更好的消息是:ASP.NET身份现在正在使用支持声明,而4.5 GenericPrincipal派生自ClaimsPrincipal,而后者又来自IPrincipal,所以我可以使用声明而不是旧时尚角色(我们仍然可以使用)如果我们想)。

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

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

2.使用thinktecture Nuget而不是授权或ClaimsPrincipalPermission属性,它们为您提供了两者的优点。

3.了解Claims.yo永远不会后悔。