认证,授权2

以前对这部分一直糊涂着,总算理理清楚了

包名:System.Security.Principal:
Identity:(识别)包装了已经验证过的用户名和认证的方式
 主要成员:Name, IsAuthenticated, AuthenticationType
Principal: 当前代码的security上下文。包含Identity和Roles. 用于授权
 主要成员:IsInRole, Identity

* // 一般用户可以有多个Indentity, 即多种身份来访问不同资源 --pending
* 每个AppDomain里面都有CallContext,CallContext里面包含Principal。线程在启动的时候也会带上Pricncipal的ref。静态方法,仅对当前线程
* Thread.CurrentPrincipal / WindowsIdentity.GetCurrent()静态方法返回当前用户。

Permission: 权限。不是用户需要权限,是执行它的代码需要权限。
     Demand()要求调用此代码的代码有什么权限。Assert()断言
三种权限:
  1 代码权限: 基类为CodeAccessPermission .用来保护环境变量、文件、访问非托管代码。总表参见:
       ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/cpguide/html/cpconcodeaccesspermissions.htm
  2 Identity权限:基类为CodeAccessPermission。对应于控制台中的信任集设定。基于发行者、强类型、域、URL。总表:
   ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/cpguide/html/cpconidentitypermissions.htm
  3. PrincipalPermission(Role Based Permission)

Authorization 授权 判断用户是否有权操作,比如登录的用户有没有权限访问资源或者数据库
Authentication 认证 用户的Identity. 主要有:HTTP基础认证、证书、Kerberos、Passport、NTLM、Forms-based、Digest

这两个东西最好从读音上区别,以前一直糊涂。一般应用先authenticate用户, 判断用户是否能链接到系统。然后authorization, 判断对某个功能是否有权限。

authorization一般有两种:ACL/ROLES
ACL:Acess Control Lists. 判断用户是否在有权限的用户组内。缺点:不能定义动态条件。
Role based: 用户加入到某个role以后,自动获得了很多特定的权限。先判断请求者的Identity, 然后看它是否在Role里面。类似windows用户和组的关系

1. 代码中的检查方式:new PrincipalPermission(name,role).Demand();
2. 利用Attribute的方式:[PrincipalPermissionAttribute(SecurityAction.Demand,Name="MyUser", Role="Administrator")]
3. 使用 Principal 对象中的属性和 IsInRole 方法执行显式安全性检查。
4. web.config里面authorization节中的users/roles(这个一般资料都没提到)


参考:
台湾MSDN Library 中文技術文件PPT, 文章
台湾msdn里面有不少好东西,比china的强多了!

补充:
1. ASP.net中线程的Principal是根据HttpComtext.Current.User来的,但是从线程取更值得推荐(与asp.net无关)
2. AppDomain.CurrentDomain.SetPrincipalPolicy设定Thread.CurrentPrincipal的预设值
3. AppDomain.CurrentDomain.SetThreadPrincipal(Thread.CurrentPrincipal) 设定新线程的预设Principal, 只能调用一次

1. HttpContext.User用来设定登录后的User,可影响到System.Web.UI.Page.User(只读)和System.Threads.Thread.CurrentPrincipal.

2. global.asax的AuthenticateRequest事件中也可以设定HTtpContext.User。

3. 参考:建置安全的 ASP.NET 應用程式: 驗證、授權和安全通訊( http://www.microsoft.com/taiwan/msdn/books/ataglance/SecNetAP04.htm)

4. Intercepting Filter (截取筛选器)实现IHttpModule, 并自行处理以下事件:

BeginRequest. 此事件标志着这是一个新请求;每个请求都必须产生该事件。

AuthenticateRequest. 此事件标志着所配置的身份验证机制已经验证了请求。附加到此事件可向筛选器确保请求已通过身份验证。

AuthorizeRequest. 与 AuthenticateRequest 一样,此事件标志着现在请求在处理过程中又前进了一步,并且请求已经得到授权。

ResolveRequestCache. 输出缓存模块使用此事件来简化对已经缓存的请求所进行的处理。

AcquireRequestState. 此事件标志着应该获得各个请求状态。

PreRequestHandlerExecute. 此事件标志着请求处理程序将要执行。这是在调用此请求的 HTTP 处理程序之前您可以参与的最后一个事件。

下一个列表显示了处理请求之后产生的事件。这些事件是按照发生的顺序列出的:

PostRequestHandlerExecute. 此事件标志着 HTTP 处理程序已经完成了对请求的处理。

ReleaseRequestState. 此事件标志着应该存储请求状态,因为应用程序已经完成了对请求的处理。

UpdateRequestCache. 此事件标志着代码处理已完成,可以将文件添加到 ASP.NET 缓存中。

EndRequest. 此事件标志着已完成对请求的所有处理。这是应用程序结束时所调用的最后一个事件。

此外,以下三个请求处理前事件可以按不确定顺序引发:

PreSendRequestHeaders.此事件标志着 HTTP 头将要发送给客户端。因此可以在发送之前添加、删除或修改头信息。

PreSendRequestContent. 此事件标志着内容将要发送给客户端。这为发送之前修改内容提供了一个机会。

Error. 此事件标志着有未处理的异常。

在web.config中添加:
<httpModules>
<add name="UserLogModule" type="UserLogModule, ifilter" />
</httpModules>

你可能感兴趣的:(认证)