Claims-based
分开认证和授权,如用QQ账户登录系统。
.net 下实现
ClaimsIdentity
ClaimsPrincipal
Windows
使用windows认证:
<authentication mode="Windows" />
相关模块:
WindowsAuthenticationModule //AuthenticateRequest事件,使用从IIS传递到ASP.NET的Windows访问令牌(Token)创建一个WindowsIdentity对象,Token通过调用context.WorkerRequest.GetUserToken()获得, 然后再根据WindowsIdentity 对象创建WindowsPrincipal对象, 然后把它赋值给HttpContext.User
UrlAuthorizationModule //
FileAuthorizationModule //判读HttpContext.User.Identity如果是WindowsIdentity, 则调用 AccessCheck Win32 函数(通过 P/Invoke)来确定是否授权经过身份验证的客户端访问请求的文件。果该文件的安全描述符的随机访问控制列表 (DACL) 中至少包含一个 Read 访问控制项 (ACE),则允许该请求继续。 否则,FileAuthorizationModule 类调用 HttpApplication.CompleteRequest 方法并将状态码 401 返回到客户端。
LDAP //访问域
DirectoryEntry entry = new DirectoryEntry("LDAP://test.corp");
安全上下文与用户模拟:
HttpContext.User.Identity //登录windows的账号identity
WindowsIdentity.GetCurrent() //获取与当前线程相关的WindowsIdentity对象,当前线程运行在IIS进程中,得到IIS的账户identity
使用模拟可使WindowsIdentity.GetCurrent()返回HttpContext.User.Identity对应的identity
<authentication mode="Windows" /> <identity impersonate="true"/>
Forms认证
相关模块:
Request.IsAuthenticated //判断是否是登录用户发起的request
HttpContext.User.Identity.Name //获取登录名
FormsAuthenticationModule //用于Form认证, 检查用户身份的cookie,并生成identity对象,处于AuthenticateRequest事件
FormsAuthentication.SetAuthCookie(loginName, true) //登录时调用,创建cookies
FormsAuthentication.SignOut() //注销
UrlAuthorizationModule //url授权,处于AuthorizeRequest事件
FormsAuthenticationTicket //根据用户名创建,可以包含额外数据,加密后放cookie
受限页面(登录夜可以正常访问因为设置了HttpContext.SkipAuthorization = true)
<location path="Admin"> <system.web> <authorization> <allow roles="Admin"/> <deny users="*"/> </authorization> </system.web> </location>
css js 目录可以添加以下web.config,使其可以正常访问
<configuration> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </configuration>
实现原理:
使用form认证:
<authentication mode="Forms" > <forms cookieless="UseCookies" name="LoginCookieName" loginUrl="~/Default.aspx"></forms> </authentication>
登录流程:
1.判断用户名密码是否正确
2.根据登录名创建FormsAuthenticationTicket
3.用FormsAuthentication.Encrypt()加密(用到machinekey)
4.加密内容放入Response写入cookies
5.站点内重定向
认证流程:
1.请求是带上加密cookies
2.FormsAuthenticationModule读取cookies
3.提取FormsAuthenticationTicket对象,并判断是否过期
4.根据FormsAuthenticationTicket构建FormsIdentity并设置HttpContext.User(Prinsipal对象) //如何判断FormsAuthenticationTicket是合法的?
5.UrlAuthorizationModule检查页面授权
enableCrossAppRedirects="true" //跨站点form认证
OWin
通过application delegate解耦web应用与服务
.net 认证基础
FormsAuthenticationTicket(form认证)
Identity(包含Name,IsAuthenticated,AuthenticationType)
Principal(AppDomain级别,包含Identity,包含InRole()判断在那个用户组)
RoleProvider(基于Principal实现)
[Authorize(Roles="Users")] //可用在controller上
GenericPrincipal?
DefaultAuthenticationModule?
reference:
http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html
http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html#