授权(Authentication)

时间:2022-11-28 07:53:49

一般概念:
1。初始化整个AppDomain的Principal策略(ASP.NET中策略由webconfig决定;更改无效;):
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.NoPrincipal);
   有时候需要(但一般不需要,并且多次调用会产生Exception):
   初始化整个AppDomain的Principal:
        AppDomain.CurrentDomain.SetTreadPrincipal();
2。初始化Principal:
                new Identity();
                new Principal();          
                Thread.CurrentPrincipal = myPrincipal;
    3。Principal的两个: Identity;
                         IsInRole();
    4。Identity的属性:  Name;
                         AuthenticationType;
                         IsAuthenticated;——一旦给Identity赋值了Name和AuthenticationType,该属性就为true;否则为false;

Login步骤:
1。检验uid;pwd;
2。正确,则初始化Identity(Name,AuthenticationType——则此时IsAuthenticated=true),和Principal;
3。错误,也初始化Identity(Name="",AuthenticationType=""——则此时IsAuthenticated=false),和Principal;
4。if(Identity.IsAuthenticated)
   {
        Principal.IsInRole();// 判断用户角色;
   }

分类:   WebForm:
        Forms认证:                设置web.config中认证方式为:Forms;及loginURL;
                        我想过程可能是这样的:每次请求一个页面,aspnet_isapi都会检查Identity.IsAuthenticated属性;
                                              为True,允许用户访问页面资源;False,定向到loginURL页面;
                                              所以Login的角色相当于Windows自己的验证,只不过是给Identity初始化;
                        但是,这是错误的:aspnet_isapi不会检查Identity.IsAuthenticated属性;这个属性只有自己的代码来检查;
                                          相当于开发人员有三种编码依据:Name、Type、Role;据此判断流程;
                        所以重要的一点就是保存用户的Principal(即HttpContex.Current.User),可以用Cookie;或缓存(是否能行??);
                设置IIS-安全性-匿名访问;
                写Login代码,分两步:
                        一。验证UID、PWD,并给Identity初始化;
                        二。重定向到原始请求页面:FormsAuthentication
               
       
        Windows认证:                WindowsIdentity myIdentity = new WindowsIdentity("kevin","Normal");//为什么总是“无法登陆”???
                Thread.CurrentPrincipal = new WindowsPrincipal(myIdentity);
                正确方法:
                设置web.config中认证方式为:windows;
                设置IIS-安全性-去掉匿名访问,勾选windows集成认证;
                则客户端访问时,第一次出现登陆对话框;
       
   WindowForm:
        Windows认证:??
               

突然觉得,Identity不过是一个用户信息的包装而已,包装了Name和Type,还要一个表示“是否包装”过的标志位:IsAuthenticated。
Principal才提供了一些验证的功能,如IsInRole。
另外重要的一点时:他们两个都是和线程(Thread)相关的,我想这是与自己包装的类的最大区别。
所以在编写线程相关的代码时(如线程池),需要注意:新创建的线程将使用一个新的Principal和Identity,除非自己编码:
myNewTread.CurrentPrincipal = Thread.CurrentPrincipal;
myNewTread.Start();
(对于BeginInvoke是个例外,确不知道是什么意思。)