一般概念:

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是个例外,确不知道是什么意思。)