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

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

 

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

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

首先需要配置IIS:

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

 

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

 

划应用目录树:

根目录的权限设置覆盖子目录的设置,把管理页面单独放在一个路径下,举例如下:

\root\

\root\admin

\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文件<?xml version="1.0"?>
<configuration>
    
<system.web>
        
<authorization>
            
<allow roles="domainname\username1" />
            
<deny users="*"/>
        
</authorization>
    
</system.web>
</configuration>

 

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

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

 

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

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

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

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

 

到目前为止,其实就已经算是完成了,由于我前面链接数据库所使用的是安全连接,没有使用sa,如果使用了sa,实际上可以到此为止了。但是如果使用sa或者其他SQL管理的用户帐号,那实际上我就把口令写到了配置文件里面,这样不好。

 

因为我使用了安全连接,每次用户登录应用的时候,系统自动匹配当前用户登录所使用的域用户名,去链接SQL数据库,这样,实际上你需要给每一个域用 户分配访问SQL的权限,这样既麻烦,而且也不是我们想要的。按一般的开发模式,都是采用一个代理帐号去统一链接数据库的。那怎么打开这个代理呢?

 

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

 

增加这么一句就打开了代理,实际上每次客户连接应用,都是通过这个指定的代理用户去访问数据库的。到此为止也可以了。但是,这样,即使是在连接数据库字符串里采用了安全连接,可是最后还是把用户口令写道了配置文件里面!这可不是我想要的!接着实验,

 

<identity impersonate="true" />

 

 

把用户名口令从这句里面去掉,但是在哪里去指定这个代理用户呢?

 

再次修改IIS指定代理用户

建立一个新的应用程序池,右键选择属性,identity用户表示里面,把匿名用户去掉,在下面选择代理用户。

这样每次,应用就会使用你所指定的代理用户去链接数据库。

 

这样,你既使用了安全连接,有没有把任何用户的口令写在配置文件里面。

 

当然,这还不算真的完成程序了。例如,如果你需要在应用中显示当前用户身份,而且需要根据用户身份去判断,谁有权限去修改相关记录怎么办?

 

 

在代码中调用域用户权限
增加 Using Page.User.Identity 这个引用,在代码重用如下代码来访问域用户身份。

 

Page.User.Identity.Name

 

 

 

下面的我还没研究,不过难点应该都在上面了 :) 如有错误,欢迎批评指正。

 

Page.User.Identity.IsAuthenticated

 

 

在ASP.NET中, 启用Windows集成验证,这样我们就有了登陆网页的用户名和密码的哈希版本,但是我们是不能直接使用的,因为是密码的哈希版本,而不是密码本身。

比如:

System.DirectoryServices.DirectoryEntry de = new System.DirectoryServices.DirectoryEntry(
             
"LDAP://22.11.21.232:389/OU=ou0000_team,OU=ou0000_unit,OU=ou0000_division,DC=bocadtest,DC=com"
,
                
"administrator", "admin"
,System.DirectoryServices.AuthenticationTypes.Secure);


我们不能使用此构造函数来传入用户名和密码,所以只能把此ASP.NET运行线程的安全上下文传递过去,这样的话,我们需要在Web.config中,加入下面的标记:

    <authentication mode="Windows" />
    <identity impersonate="true"/>   


这样的话,就可以把安全上下文传递下去了,使用下面的构造函数:

System.DirectoryServices.DirectoryEntry de = new System.DirectoryServices.DirectoryEntry(
                
"LDAP://22.11.21.232:389/OU=ou0000_team,OU=ou0000_unit,OU=ou0000_division,DC=bocadtest,DC=com");

 

这样就可以用用户的权限来操作active directory了。当然如果使用带用户名密码的构造函数也可以,因为用户名和密码已经不起作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值