ASP.NET身份验证

身份验证是程序开发的第一步,也是程序开发的基础步骤,对于整个系统的安全性起到了非常大的作用,所以说些asp.net验证技术和大家探讨。
1.Asp.net是依存于IIS的一个服务,说到Asp.net的安全相关的话题当然要有一个整体上的思路:IIS接收—》IIS验证—》IIS授权---》ASP.net验证---》Asp.net授权---》资源返回给用户IIS从网络上接收到一个HTTP WEB请求可以使用SSL技术来保证服务器的身份,此外SSL也可以提供一个安全通道来保护客户端和服务器端的机密数据的传送。
IIS使用基本 摘要式 或者其它的方式验证用户,如果网站中的大部分内容不需要验证就可以设定为匿名验证。验证之后是授权,通过授权IIS来允许或者禁止用户访问某资源。IIS可以使用ACL定义的NTFS权限或者针对IP地址的客户端授权。IIS把Windows存取令牌传送到Asp.net,如果IIS使用的是匿名验证则为匿名Internet使用者的存取令牌(IUSER_MYMACHINE)。
ASP.net验证访问者(有三种方式):
1.Asp.net授权所需要的资源或者操作(有两种授权方法)。Asp.net中程序的代码使用特别的身份来存取本机或者远程资源。

2.身份验证:身份验证就是一个解决谁有权力进入系统的问题,通常的做法就是跟系统维护的用户名单进行核对,这样转化为一个实际的技术问题:
如果有效的判断一个用户是不是系统的有效用户。这个过程就是—Authentication(身份验证)专业说法:接收用户凭据,并根据指定的颁发机构来验证凭据的过程成为身份验证

3.Asp.net 提供三种身份验证方式:Windows验证 、Forms验证 、Passport验证身份验证的使用是通过配置Web.config文件的< Authentication >配置节来实现的

4.授权:授权就是确认用户拥有足够的权限来访问请求的资源5.Asp.net提供两类授权服务:文件授权服务 、URL授权服务技术细节。


asp.net的身份认证设置主要是3个地方:

1.web.config,主要是< authentication>和< identity>两个设置。

2.iis中每个站点的设置。

3.iis中应用池(application pool)的设置。


1和2主要是控制用户用什么身份来访问站点,三主要是控制iis进程(w3wp.exe)所用的身份。
比如,用户登陆www.sytm.net后又要访问该网站的数据库,如果数据库服务不是和IIS在同一台机器上,那么登陆www.sytm.net用的是web.config和iis站点的设置,而连接数据库用的是应用池里的设置

4.而网站登陆设置,这里牵涉到三种身份:

4.1.如果web.config里设置< authentication mode="windows" /> < identity impersonate="false" />
iis里设置:允许匿名访问,并选中集成认证方式则访问网站时,操作系统线程所用的身份,也就是可以用System.Security.Principal.WindowsIdentitiy.GetCurrent().Name取出来的值是:NT AUTHORITYNETWORK SERVICE,.net所管理的线程所用的身份,也就是可以用System.Threading.Thread.CurrentPrintcipal.Identity.Name取出来的值是:
空asp.net所用的HttpContext所用的身份,也就是用HttpContext.Current.User.Identity.Name取出来的值,是:空3.
登陆网站后,asp.net所使用的身份,和web.config里的设置以及iis里的设置的组合有关。


4.2.如果web.config里设置:< authentication mode="windows" /> < identity impersonate="false" />
iis里设置:允许匿名访问
则iis里的身份是(缺省情况下)机器名IUSR_机器名,asp.net所用的身份是NT AUTHORITYNETWORK SERVICE。

如果web.config里设置:< authentication mode="windows" /> < identity impersonate="true" />
iis里设置允许匿名访问,则
iis里的身份是(缺省情况下)机器名IUSR_机器名,asp.net所用的身份也是机器名IUSR_机器名,也就是说接受iis认证的用户名还是上面情况,

但iis里设置只允许windows集成身份认证,则iis里的身份和asp.net所用的身份都是客户登陆windows时所用的域名用户,(比如你打开机器,登陆你的windows xp时是用 mydomainmyid登陆的,则这里的身份就也是mydomainmyid)

4.3.如果web.config里显式地设置了用户名和密码,即:< identity impersonate="true" userName="myname" password="password" />
则不管iis里是设置成匿名访问还是windows身份认证,asp.net都使用web.config里指定的用户

5.如果从asp.net里访问数据库或web service,或者reporting service,则如果要访问的服务和iis不在同一台机器上,所使用的身份就将是iis应用池里所设置的身份。也就是说iis无法将asp.net身份传递过去(据说如果和所要访问的服务器设置成可信站点(trusted site)就可以传过去,但我由于权限不够,没试过)所以,在连接数据库时,尽量用sql server的认证方式,也就是在connection string里,不用integrated secruity=true或者integrated secruity=sspi的方式,而是直接指定用户名和密码:
uid=myid;pwd=password的方式,这样,即使iis传过来的是匿名用户,也能正确登陆数据库如果一定要用integrated secruity=true或者integrated secruity=sspi的方式,则必须在iis的应用池里设置好可以登陆的windows用户和密码访问reporting service,则又必须在代码里用NetCredentials(username, password, domain)的方式指定用户名和密码如果是用wcf web service,配置windows身份认证又要用别的方式,也很烦人,不提也罢!

原文地址:https://www.cnblogs.com/chengeng/p/5687087.html