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