【问题标题】:Authorize with Roles in onion Architecture在洋葱架构中使用角色授权
【发布时间】:2014-11-16 06:03:37
【问题描述】:

大家好

我有一个使用 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。

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

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

这两件作品

[Authorize(Roles="Admin")]

这是一个。

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

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

感谢您的宝贵时间

【问题讨论】:

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


    【解决方案1】:

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

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

    问题来自为用户生成的 Cookie。因为角色与他们需要存在的 Cookie 相关联,因此 IsInRole 可以找到它们,这就是我犯错误的地方。我将身份验证和授权移到了其他地方,但是我没有提供将角色信息嵌入 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 永远不会后悔。

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2014-10-15
      • 1970-01-01
      • 2014-06-22
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2023-04-02
      相关资源
      最近更新 更多