认证方式

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#

原文地址:https://www.cnblogs.com/yfann/p/4679060.html