xBlues

My simple life in Shanghai

导航

如何在ASP.NET应用中集成Windows域帐户来进行权限控制

如何在ASP.NET应用中集成Windows域帐户来进行权限控制

 

企业应用程序采用域用户来代替独立的用户管理模块的好处很多。

  • 程序本身不需要单独编写用户帐号管理模块
  • 与域用户集成,用户不需要单独记忆用户名口令,可以实现无缝登录
  • 采用域用户方案安全性提升,认证时口令不在网上传输,域用户安全级别
  • 其他好处多多

首先需要配置IIS:

为你的应用单独建立一个web虚拟目录,右键选择属性里的目录安全,权限与访问控制,把“打开匿名访问”不选,仅仅选择“集成Windows权限认证”,别的都不要选,确定。

 

集成域用户来控制用户访问的途经有两种,一种是利用NTFS权限控制表,缺点是每次转移应用之后,需要逐个设置目录访问权限。另外一种是通过配置web.config文件,通过URL来控制,好处是直接修改配置文件就可以了,不需要每次发布应用时变换一次目录就修改一次。下面我就主要介绍一个后者。

 

划应用目录树:

根目录的权限设置覆盖子目录的设置,把管理页面单独放在一个路径下,比如在根目录下设置一个admin子目录管理页面都放在这下面;再设置一个sales的子目录,只有销售的同志可以访问,user则是任何人都可以访问。举例如下:

\root\

\root\admin

\root\sales

\root\user


 

修改配置文件:

在需要进行权限配置的目录下面,分别建立web.config文件。root下面肯定需要一个配置文件了,在本例中由于admin路径下放置了管理页面,因此我在admin下面也建立了一个web.config配置文件。

 

root下的web.config配置文件的和权限相关的内容如下:

<?xml version="1.0"?>
<configuration>
    
<connectionStrings>
        
<add name="APPConnectionString" connectionString="Data Source=MachineName;Initial Catalog=DatabaseName;Integrated Security=SSPI"
    </connectionStrings
>
    
<system.web>
        
<authentication mode="Windows" />
            
<!--<identity impersonate="true" userName="UserName" password="PassWord" />-->
            
<identity impersonate="true"/>
        
<authorization>
            
<allow roles="UserName,domainname\username1,domainname\username2,domainname\usergroup1" />
            
<deny users="*"/>
        
</authorization>
    
</system.web>
</configuration>

 

admin目录下也增加一个web.config文件 (sales目录下配置文件类似,就是允许sales的账户访问该目录即可)

<?xml version="1.0"?>
<configuration>
    
<system.web>
        
<authorization>
            
<allow roles="domainname\username1,domainname\usergroup1" />
            
<deny users="*"/>
        
</authorization>
    
</system.web>
</configuration>

 

首先,先解释一下admin下面的这个配置文件,我允许domainname\username1访问这个管理目录,而禁止任何其他的用户来访问这些功能页面。

下面,再接是一下root下面的这个配置文件,我增加了一个链接数据库的字符串,采用的是MS推荐的安全连接,没有使用sa之类的SQL管理的账户。

 

authentication mode="Windows" 的意思是集成域用户,这句话是打开应用支持域用户的关键。

allow roles=",,," 列表里面我规定了可以访问root的用户,每个用户之间用逗号分隔,这里可以指定服务器本机用户,也可以指定域用户,或者域用户组

deny users=",,," 列表里我规定了禁止所有用户访问(允许列表里的用户除外)

以上这两个类表可以使用的通配符有 ? 匿名用户, * 所有用户

 

到目前为止,其实就已经算是完成了,就这么简单。

 

用户代理

Impersonate,除非有特殊要求,比如在同一个服务器上运行同一个应用,需要区别不同公司的操作,可以分别建立应用程序池,采用不同代理帐号,来区分访问,否则,这个代理账户是不需要的(而且会引起性能下降),这个代理用户现象缺省是关闭的。

 

如果不采用用户代理,每次用户登录应用的时候,系统自动匹配当前用户登录所使用的客户端的域用户名

如果采用用户代理,就是指定一个代理用户,代理所有表现曾用户的一切操作请求。

 

可以用下面的配置指定固定的代理用户

<identity impersonate="true" userName="UserName" password="PassWord" /> 

或者采用下面的设置,指定应用程序池的用户作为代理

<identity impersonate="true" />

 

缺省情况下,这个用户代理是关闭的,缺点也不少,MS不推荐使用,所以,你就跳过这部分吧。

 

 

下面说一下如何采用信任账户去链接SQL数据库

这一部分,实际上用的很广泛,MSDN有专门的一篇来讲解这个,你可以参考,

http://msdn.microsoft.com/en-us/library/ms998292.aspx

 

如果使用了sa或者其他SQL管理的用户帐号,那实际上我就把口令写到了配置文件里面,这样安全性不好。当然微软也提供了补救办法,就是可以使用一个命令行加密工具把配置文件加密成密文,总之是不好了,那怎么使用信任连接连接数据库呢?配置文件照着下面写,

<connectionStrings>

    <add name="ConnectionStringName" connectionString="Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
</connectionStrings>


下一步是怎么配置这个信任的用户的权限,这个账户必须同时具有运行IIS应用的权限,和访问SQL的权限。一般可以指定一个特定的新建用户,当然,为了简化配置,如果web服务器和SQL服务器都在一台机器上,也可以使用预置好的服务帐户NT AUTHORITY\NETWORK SERVICE,否则你就需要建立一个域用户了,格式可以是domainname\webmachinename。然后就是分配给这个用户访问SQL的权限。

 

 

给应用指定运行用户

建立一个新的应用程序池,右键选择属性,identity用户表示里面,把匿名用户去掉,在下面选择用户,可以选择你上面新建的用户,也可以使用NT AUTHORITY"NETWORK SERVICE。



在代码中调用域用户权限
 在代码使用如下代码来查看访问者域用户身份。

Page.User.Identity.Name

Page.User.Identity.IsAuthenticated


增加引用using System.Security.Principal;

 

使用如下代码查看采用信任链接 方式同一访问SQL的用户身份,也就是你在应用程序池里指定的那个用户名。

WindowsIdentity.GetCurrent().Name

 

如有错误,欢迎批评指正。

 

下面图标说明了应用层采用Windows用户进行安全认证,应用层和数据服务器之间则采用信任链接统一访问的原理。

 

 


posted on 2008-07-31 12:03  Blues  阅读(3648)  评论(12编辑  收藏  举报