1 Identity 介绍
2 授权系统
图1 体系结构
3 自定义 Attribute
自定义 Attribute 继承于 AuthorizeAttribute,AuthorizeAttribute 具有 Roles 与 Users 属性,如果直接使用则可以对角色和用户进行权限控制。在本体系中最终的权限校验落地于 Claim,Claim 具有公共属性如下:
名称 |
说明 |
ClaimType |
Gets the Type of the current Claim. |
Issuer |
Gets the Issuer of the claim. |
OriginalIssuer |
Gets the original issuer of the claim. |
Properties |
Gets the collection of Properties that are name-value pairs. |
Subject |
Gets the Subject of the Claim. |
Value |
Gets the Value of the Claim. |
ValueType |
Gets the ValueType of the Claim. |
选取 Issuer、ClaimType 和 Value 属性在权限验证时进行校验,可以根据实际情况选取合适校验属性。
在之前工作中,了解到 REST 风格 API,个人对其对目前 Web 现状提取的解决方式是比较认同的(不过那篇论文写了好多年),所有在权限验证时,同时校验了 HTTP 请求的 Method。
由此,自定义 Attribute (ClaimsAccessAttribute)具有以下属性:
访问权限 |
类型 |
属性名称 |
说明 |
public |
string |
Issuer |
同上 |
public |
string |
ClaimType |
同上 |
public |
string |
Value |
同上 |
public |
MethodType |
MethodTypeValue |
http method value |
4 授权
传统的授权方式有给用户分配不同的角色,不同的角色具有若干的访问权限。但角色如何具有访问权限,有的系统使用菜单可见则可以访问,实际上并没有实现严格的权限验证,不过其可以满足普通企业应用权限要求。但是在这种设计过程中,硬编码比较严重,以及哪些方法可以是菜单(或者提供服务)没有明确的界限。
基于上述原因,便引入了自定义属性(ClaimsAccessAttribute),当决定将某个方法设置为菜单,则使用自定义属性修饰,并通过设置其属性来设定该菜单应当的权限(简单的理解此处权限等同于 Claim)。
Asp.Net Identity 的引入很大一部分原因是为了解决允许使用第三方授权登录系统(或使用服务),基于此,用户是可以直接关联 Claim,这样得到好处是允许向现有用户添加第三方 Claim,而不是必须根据第三方 Claim 创建用户(这样的好处仔细一想并没有实用),以及临时授权,再者动态权限(这块了解不多),但这种关联带来的灵活性是好的。
额外,通过反射可以很容易获取自定义的 Attribute,从而方便在权限认证。
5 系统实现 demo
实现代码地址:https://github.com/sangeren/IdentityMine
5.1 系统实现内容
(1)基于角色的权限管理
(2)自定义 ClaimsAccessAttribute ,并验证
5.2 系统存在问题
(1)controller 下的 action 分配权限,深层次的问题是 Claim 是预设,还是动态创建。预先设置给到的 claim 系统会比较好实现,但没有动态创建的灵活度高。最终应该是取决于具体的情形。
6 总结
这篇基本是2个月之前写的,中间一段时间有别的事情,再加上比较懒,然后一直没有公布。然后好多东西都忘记了(擦汗),不过我希望能在这个点上进行一点探讨,欢迎各位指出问题,不胜感激!
7 参考
【1】Microsoft msdn
还有几篇博客园的文章!