找回密码
 FreeOZ用户注册
查看: 4193|回复: 11
打印 上一主题 下一主题

[软件技巧] asp.net如何使用windows账户进行安全认证

[复制链接]
跳转到指定楼层
1#
发表于 30-7-2008 19:02:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除, 无法发言

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

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

http://i.msdn.microsoft.com/ms998292.f01paght00000801%28en-us,MSDN.10%29.gif

--------------------------------------------------------------------------------------------------------------


构建安全的企业内部WEB程序

为了保护企业内部的敏感信息、方便用户管理、确保用户只访问他们应该访问的地方。我一直在寻找最便捷的方法……查询了一些资料,下述是我个人的一些理解。我们集合IIS和ASP.NET,通过验证(authentication)和授权(authorization)来实现企业WEB程序的安全。客户端对page.aspx的请求是这样发出的:
这里涉及到两个重要的概念,它们定义如下:

验证(Authentication):标识请求页面的用户。( The process of identifying the user who is requesting the page).
授权(Authorization):系统判定用户访问资源的权限。(System determines which resources he or she has access to.)

       第一步,我们需要确定身份验证的类型。(条件1)在企业内部网中,我们已经有了包含所有用户帐号的数据库-活动目录,同时每一个登陆内部网的客户端都使用不同的用户帐号。现存的身份验证有:Windows身份验证、Forms身份验证、Microsoft Passport 身份验证。(条件2)其中Windows身份验证是基于现存的Windows 安全架构,它通过角色(Roles)控制来实现web程序的安全性。(结论)根据上述条件,我们采用基于Windows(Windows-based)的身份验证,我们需在Web.config文件中这样描述:


<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
                <customErrors mode="Off"/>
                <authentication mode="Windows" />
                <authorization>
                        <allow roles="domain\user1,domain\user2,domain\usergroup1,domain\usergroup2" />
                        <deny users="*" />                  
                </authorization>
    </system.web>
</configuration>

(注意:XML文件是区分大小写的)


为了实现Windows身份验证,IIS提供了三种类型:基本验证(Basic)、域服务器简要验证(Digest)、集成Windows验证(Integrated Windows Security)。

(条件1)用户能够登陆到内部网,他就通过了活动目录对他的验证,并拥有一张证书(credential)。当用户请求安全页面时,浏览器就会把证书传送给IIS。(条件2)集成Windows验证就是把IIS要求的身份验证预先交由活动目录来完成。(结论)这就是说:采用集成Windows验证方式,用户一登陆内部网就预先通过了IIS对他的验证。所以,我们采用集成Windows验证。

第二步,对要访问的资源授权。对资源进行授权的方式有两种:文件授权(file authorization)和URL授权(URL authorization)。

文件授权基于Windows 2000的ACL(Access Control List),它的优点在于通过ACL控制文件和文件夹是非常容易的;它的缺点在于,需要花费时间来管理不同文件/文件夹的ACLs,而且程序迁移时,ACL并不随着文件夹copy and past而迁移。

URL授权是在web.config中对不同的URL或文件夹进行授权。它的优点在于程序迁移方便;缺点是需要在web.config中书写代码。

微软推荐我们采用文件授权的方式,但基于可迁移性考虑,我还是采用了URL授权方式。假设marketing.aspx是只有管理员和营销部(成员都属于marketing用户组)才能访问的页面,fold文件夹下面包含了只有管理员和人事部(假设成员都属于human用户组)才能访问的页面。我们在web.config中这样设置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
                <authorization>
                        <allow roles="global\user1" />
                        <deny users="*" />                  
                </authorization>
    </system.web>
</configuration>

* 所有
? 匿名用户

这里的web.config文件继承了父目录下的web.config文件的设置,并按自己的要求改写了设置。

通过验证和授权这些简单的设置,我们在企业内部网中实现了初步的安全。

[ 本帖最后由 xblues 于 1-8-2008 14:26 编辑 ]
回复  

使用道具 举报

2#
发表于 30-7-2008 19:30:07 | 只看该作者
对浏览器有要求,必须是IE。Firefox还得再输入一遍密码....
回复  

使用道具 举报

3#
 楼主| 发表于 31-7-2008 12:42:59 | 只看该作者
提示: 作者被禁止或删除, 无法发言
新版的FF3没问题,一次输入就可以了。
使用域帐户的好处是不需要从程序里处理用户帐户部分,只需要增加配置文件即可。好处是:利用了企业域用户资源,增加了安全性,采用统一的域用户,不需要用户另外记忆用户名和密码。
回复  

使用道具 举报

4#
发表于 31-7-2008 13:11:38 | 只看该作者
目前这种基于浏览器的web访问方式具有先天的安全缺陷。
回复  

使用道具 举报

5#
 楼主| 发表于 31-7-2008 15:10:13 | 只看该作者
提示: 作者被禁止或删除, 无法发言
目前好像还没有什么更好的web认证方法吧?
这个集成windows的认证方式是IIS提供的相对来说比较安全的的一种。
回复  

使用道具 举报

6#
发表于 31-7-2008 22:43:50 | 只看该作者
有个问题,当一个用户向IIS请求资源的时候,IIS还要再对用户进行一次认证吗?
回复  

使用道具 举报

7#
 楼主| 发表于 1-8-2008 11:33:00 | 只看该作者
提示: 作者被禁止或删除, 无法发言
IIS当然要认证了。一般都是允许匿名访问,你感觉不需要认证一样。去掉匿名访问,你就感觉到需要认证了。
IIS的认证方法很多,Windows集成认证,passport认证,明文认证等等,还有证书认证。

一般应用程序都是采用IIS匿名认证,然后有应用程序自己处理用户认证。
可是如果你的应用主要是在Windows系统的企业环境中使用,那为什么不用域帐号呢?安全性高,自己也不用写这部分模块,而和而不为呢。最简单的方法就是采用Windows认证,控制用户对指定URL的访问权限。
回复  

使用道具 举报

8#
发表于 1-8-2008 15:55:27 | 只看该作者
就是说当用户向IIS请求资源时,如果IIS是Windows集成认证,那么IIS就拿用户名和密码去Active Directory再验证一下用户?

IIS Windows集成认证方式下, 访问权限的设定不是很灵活。比如一个页面要根据用户的权限动态生成菜单,那么用Active Directory户必须得保存到数据库里面才行
回复  

使用道具 举报

9#
 楼主| 发表于 1-8-2008 16:31:33 | 只看该作者

回复 #8 Coolioo 的帖子

提示: 作者被禁止或删除, 无法发言
非也!windows集成认证,等于用户管理部分已经是成型拿来就可以用的了。
你在配置文件里面规定好了用户可以访问的URL,修改起来十分方便。你仔细看我上面的文章。

而涉及到具体页面生成的话,可以使用语句判断。还是看上面的文章了。使用如下代码可以判断用户身份,然后根据身份生成页面。如果你喜欢使用角色,可以采用一个表,保存不同角的下面的NT用户名。当然,还可以采用asp.net集成的用户角色管理工能。(我个人觉得这个虽好,可是有点复杂,不如我自己写一个小表,来记录角色)

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

Page.User.Identity.Name
Page.User.Identity.IsAuthenticated

增加引用using System.Security.Principal;
使用如下代码查看采用信任链接 方式同一访问SQL的用户身份,也就是你在应用程序池里指定的那个用户名。
WindowsIdentity.GetCurrent().Name
回复  

使用道具 举报

10#
发表于 1-8-2008 16:45:48 | 只看该作者
回复  

使用道具 举报

11#
发表于 1-8-2008 18:47:23 | 只看该作者

回复 #8 Coolioo 的帖子

快给虫个工作吧
回复  

使用道具 举报

12#
发表于 3-8-2008 00:07:26 | 只看该作者
不错不错。弹簧虎,你的图又找回来啦

评分

参与人数 1威望 +30 收起 理由
NEWGAY + 30 是啊

查看全部评分

回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 28-4-2024 07:08 , Processed in 0.048473 second(s), 30 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表