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用户进行安全认证,应用层和数据服务器之间则采用信任链接统一访问的原理。

 

 


Tag标签: asp.net

posted on 2008-07-31 12:03 Blues 阅读(1830) 评论(12)  编辑 收藏 网摘

Feedback

#1楼  2008-07-31 12:34 charry      

收藏了   回复  引用  查看    

#2楼  2008-07-31 13:20 风中的猪儿      

支持,很少关注这个,有人研究,当然太好了   回复  引用  查看    

#3楼  2008-07-31 13:45 文炽城      

感谢。   回复  引用  查看    

#4楼  2008-07-31 16:09 Desmend      

关注一下   回复  引用  查看    

#5楼  2008-07-31 18:10 陈晨      

是不是我们局域网中配置了域控
然后根据文章中说的步骤进行配置就可以使用了   回复  引用  查看    

#6楼  2008-07-31 18:13 赖文华(SWPU小赖)      

关注!   回复  引用  查看    

#7楼 [楼主] 2008-07-31 22:47 Blues      

@陈晨
进仅仅是集成域帐户对URL的控制,我上面所说的方法可以。
指定一个用户代理去访问数据库连接,把用户名口令写道webconfig中也是可以的。(微软还有一个工具去加密这个config文件)。
我后来说的,使用应用程序池实现起来有问题。
查了一下资料,看来要想完全使用windows信任链接,而不写明文的口令还是有一定困难的。
我最后说的关于应用程序池来指定用户这一步做不了。我接着查资料。

微软的文档真长,还都是拆了东墙补西墙。 那个也不行! :(

http://www.guidanceshare.com/wiki/ASP.NET_2.0_Intranet_-_Windows_Authentication,_SQL_Roles

这里提到了什么rolemanager,可以看看,明天实验一下。

http://weblogs.asp.net/scottgu/pages/Recipe_3A00_-Implementing-Role_2D00_Based-Security-with-ASP.NET-2.0-using-Windows-Authentication-and-SQL-Server.aspx

这篇应该可以解决问题了吧?原来仅仅是使用Windows域用户进行权限控制,也不一定需要使用代理用户帐号去访问SQL的。我遇到的问题应该是如何配置windows信任链接到SQL数据库。明天看看,
http://msdn.microsoft.com/en-us/library/ms998292.aspx   回复  引用  查看    

#8楼  2008-08-01 12:52 jackWang [未注册用户]

我在用活动目录进行编程的过程中遇到了如下的问题:

1、在域服务器上设置用户下次登录时必须修改密码 (User must change password at next logon),然后登录后就提示密码已经过期了,自动跳到修改密码的窗口,密码修改成功了,但是老密码和新密码都能成功登录,这是什么原因造成的?不会是微软的Bug吧!
(这里假设我们的老密码为wsl_123,新密码为afa_789)

2、接上面的问题。下次登录系统后,想修改用户的密码,但是无论怎样都修改不成功,这又是为什么?

如果当前使用的密码用修改前的密码(即:wsl_123)并输入新密码进行修改密码操作,出现如下错误提示:
The specified network password is not correct. (Exception from HRESULT: 0x80070056)(我们公司用的是英文版的Windows 2003)
我的分析:密码已经修改成功了,要使用新的密码才能通过验证。但是使用老密码wsl_123又能成功登录,太奇怪了!!

如果当前使用的密码用修改后的密码(即:afa_789)并输入新密码进行修改密码操作,出现如下错误提示:
The password does not meet the password policy requirements. Check the minimum password length, password complexity and password
history requirements. (Exception from HRESULT: 0x800708C5)
我的分析:密码修改后,要过一段时间才能再次修改密码,不知道我的理解是否正确?

3、如何获取密码策略规则设置,如:密码的最短长度,必须包含字母、数字和下划线,密码历史要求等。当用户修改密码失败后以便提示用户。

4、最后,我们使用 Visual Studio 2005 with SP1 + C# + ASP.NET 2.0 进行编程。

请楼主帮忙看看,怎么解决这些问题。谢谢先!!   回复  引用    

#9楼 [楼主] 2008-08-01 13:40 Blues      

那你就不要设置下次登录必须修改密码呀。如果你想强迫用户定期更改密码可以通过编辑组策略实现。

组策略限制了密码的复杂程度,你的初始化密码和新密码都需要设置的复杂一点,符合密码策略要求,就是你需要用一个复杂一点的密码,字幕加数字加符号超过10位,这样的组合你试试,就满足组策略的要求了。或者你可以通过放宽组策略来放宽对密码复杂程度的要求。

你的这些问题都是windows域用户管理的问题,和编程没有什么关系。如果是管理域用户,需要到域用户安全策略中修改相关项目,如果是本地用户,就修改本地安全策略。在服务的控制面板的管理工具中可以找到安全策略管理工具。   回复  引用  查看    

#10楼  2008-08-01 14:19 jackWang [未注册用户]

楼主:

客户要求具备第1点所说的功能啊!但是两个密码都能登录到系统,你说这个奇怪不奇怪?你试试看有没有这种问题?

关于第3点,楼主有什么好方法实现?   回复  引用    

#11楼 [楼主] 2008-08-01 14:24 Blues      

@jackWang
1 你设置好用户以后,不去实验就好了。因为你试验的话,也算是“下一次登录”,所以系统就要你更改密码了。
3 提示的语句,密码策略,以及密码的复杂程度,都可以在组策略里面自定义的。好好看看组策略的设置了。
  回复  引用  查看    

#12楼  2008-08-01 15:09 jackWang [未注册用户]

楼主:

1、为什么两个密码都能登录成功?是什么设置造成的?
2、那个密码的复杂程度怎么看?在哪里可以设置?怎么编程获取到?   回复  引用    



标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-08-01 14:21 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:


相关搜索:
asp.net

相关链接: