ASP.NET成员资格功能是为了管理和授权用户,常常与窗体认证搭配使用,还有一个验证控件像Login,LoginVIew,LoginStatus,LoginName,PasswordRecovery, 和
CreateUserWizard控件。此篇文章教你如何通过很好的编辑配置文件和编写membership 相关类的优化成员管理功能安全.
Securing Connections to a Membership Data Source
Connection Strings
To Keep the connection to your database server secure, you should encrypt connection-string information in the configuration using Protected Configuration. For more information, see Encrypting Configuration Information Using Protected Configuration.
不是每个配置节都是可以被保护配置的,而且在与加密与解密的过程中也是消耗系统性能。下面是我做一个测试的配置文件:
<connectionStrings configProtectionProvider="MichaelProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>GY5yyrC0LqaoybzzwQStVw9mYuAwPvBCuDY+wPkd8IhBrk9fILYl/iVcVz7aZotAmjQFhK0eXWpDyzFfNcjfHJ2DtFd3z8cN74OAVRW8aBhvUWG6b0T7U2I36Xgscf87CGGGD7ECJbFz6J/Ga/1o5V3aE3Vbdh2iTXhjmoKOtLk=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>h8JFEmdQhYujpVctO6kDPZWd4TEZubXw/4Ye7ZWWdvyb88jdVV8qxbl1vDCD5yfj6PAUQHr6y+tDDzJYVU/WBdAhR7MKTGzuEPDkTOfYn34fkK+PbUCWhnk9Zk1rbRjcAMTY+akmwhOiix6UIa3veBtggVsnjRzqsTkFOcnlySB3vU4jbZJEyJkYRhQ7gViJkYjggjkg7BLbd5l/J+njH0eID7reMsOYHOAD+o7QiglF3TtwdDFy0Rbq48+8A8zy</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
加密后的连接字符串与以往在后台访问的方法是一样的,都是可以通过下面的方法来访问的。当然在加密前自己还是要知道加密的连接字符串的关键字(DefaultConn)
string connectStr = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DefaultConn"].ConnectionString;
系统会自动把配置文件中的加密内容解析出来。
下面的配置内容是针对使用了Membership, Role, Profile的功能配置的,为了简单没有使用上面的加密配置方法加密连接字符串。
<!--defaultProvider:提供程序的名称。默认为AspNetSqlMembershipProvider.如果有多个Provider的话,指定一个默认值是明智的做法。
connectionStringName:Membership数据库的连接名称
enablePasswordRetrieval:指定当前成员资格提供程序是否配置为允许用户检索密码
enablePasswordReset:指定当前成员资格提供程序是否配置为允许用户重置密码
requiresQuestionAndAnswer:指示默认成员资格提供程序是否要求用户在进行密码重置和检索时回答密码提示问题
applicationName:应用程序名称
requiresUniqueEmail:指示成员资格程序是否配置为要求每个用户具有唯一的电子邮件地址
passwordFormat:指示成员资格数据存储密码的格式。值可选Clear,Encrypted,Hashed.
maxInvalidPasswordAttempts:锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数
minRequiredPasswordLength:密码所要求的最小长度
minRequiredNonalphanumericCharacters:有效密码中必须包含的最少特殊字符数
passwordAttemptWindow:在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。这是为了
防止不明来源反复尝试猜测成员资格用户的密码或密码提示问题答案的额外措施。
passwordStrengthRegularExpression:计算密码的正则表达式
-->
<membership defaultProvider="CustomSqlMembershipProvider">
<providers>
<add name="CustomSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="connstr"
enablePasswordRetrieval="false" enablePasswordReset="true"
requiresQuestionAndAnswer="false" applicationName="ScottsProject"
requiresUniqueEmail="true" passwordFormat="Hashed"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="3"
minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
<profile defaultProvider="CustomSqlProfileProvider">
<providers>
<add name="CustomSqlProfileProvider"
connectionStringName="connstr" applicationName="/"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</profile>
<roleManager enabled="true" defaultProvider="CustomSqlRoleProvider">
<providers>
<add connectionStringName="connstr" applicationName="/" name="CustomSqlRoleProvider"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add applicationName="/" name="CustomWindowsTokenRoleProvider"
type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
<authentication mode="Forms">
<forms defaultUrl="Default.aspx"
loginUrl="Login.aspx"
protection="All"
timeout="30"
path="/"
requireSSL="false"
slidingExpiration="false"
cookieless="UseDeviceProfile"
domain=""/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
通过这样的配置就可以应用内置功能。可能有些刚接触这些配置的人对上述配置不太了解,下面我们来讲述一下authentication(认证)及authorization(授权)这两个配置节的属性描述让大家了解每个配置属性的意义及作用。
下面给一个authentication(认证)完全的配置
<authentication mode="Forms">
<forms defaultUrl="Default.aspx"
loginUrl="Login.aspx"
protection="All"
timeout="30"
path="/"
requireSSL="false"
slidingExpiration="false"
cookieless="UseDeviceProfile"
domain="">
<credentials passwordFormat="Clear" >
<user name="Micahael" password="123"/>
<user name="Jack" password="456"/>
</credentials>
</forms>
<passport redirectUrl="http://www.baidu.com"/>
</authentication>
属性 | 选项 | 说明 |
mode | 控制应用程序的默认身份验证模式。 | |
Windows | 将 Windows 验证指定为默认的身份验证模式。当使用以下任意形式的 Microsoft Internet 信息服务 (IIS) 身份验证时使用该模式:基本、简要、集成的 Windows 验证 (NTLM/Kerberos) 或证书。 | |
Forms | 将 ASP.NET 基于窗体的身份验证指定为默认的身份验证模式。 | |
Passport | 将 Microsoft Passport 身份验证指定为默认的身份验证模式。 | |
None | 不指定任何身份验证。只有匿名用户是预期的或者应用程序可以处理事件以提供其自身的身份验证。 |
属性 | 选项 | 说明 |
name | 指定要用于身份验证的 HTTP Cookie。默认情况下,name 的值是 .ASPXAUTH。如果在单个服务器上正运行多个应用程序并且每一应用程序均要求唯一的 Cookie,则您必须在每一应用程序的 Web.config 文件中配置 Cookie 名称。 | |
loginUrl | 指定如果没有找到任何有效的身份验证 Cookie,为登录将请求重定向到的 URL。默认值为 default.aspx。 | |
protection | 指定 Cookie 使用的加密类型(如果有)。 | |
All | 指定应用程序同时使用数据验证和加密来保护 Cookie。该选项使用已配置的数据验证算法(基于 <machineKey> 元素)。如果三重 DES (3DES) 可用并且密钥足够长(48 位或更多),则使用三重 DES 进行加密。All 是默认(和建议)值。 | |
None | 指定对于将 Cookie 仅用于个性化并且具有较低的安全要求的站点而言,同时禁用加密和验证。不推荐以此方式使用 Cookie;但是,这是使用 .NET Framework 启用个性化的占用资源最少的方式。 | |
Encryption | 指定使用三重 DES 或 DES 对 Cookie 进行加密,但不对该 Cookie 执行数据验证。以此方式使用的 Cookie 可能会受到精选的纯文本的攻击。 | |
Validation | 指定验证方案验证已加密的 Cookie 的内容在转换中是否未被改变。Cookie 是使用 Cookie 验证创建的,方式是:将验证密钥和 Cookie 数据相连接,然后计算消息身份验证代码 (MAC),最后将 MAC 追加到输出 Cookie。 | |
timeout | 指定以整数分钟为单位的时间量,超过此时间量,Cookie 将过期。默认值是 30。如果 SlidingExpiration 属性为true,则 timeout 属性是一个弹性值,以收到最后一个请求后指定的分钟数为到期时间。为避免危及性能,以及为避免向启用 Cookie 警告的用户显示多个浏览器警告,在经过了超过一半的指定时间后更新该 Cookie。这可能导致精确性上的损失。持久性 Cookie 不超时。 | |
path | 为由应用程序发出的 Cookie 指定路径。默认值是正斜杠 (/),这是因为大多数浏览器是区分大小写的,并且如果路径大小写不匹配,将不发送回 Cookie。 | |
requireSSL | 指定是否需要安全连接来转换身份验证 Cookie。 | |
true | 指定必须使用安全连接来保护用户凭据。如果是 true, ASP.NET 为身份验证 Cookie 设置 HttpCookie.Secure,兼容的浏览器不返回 Cookie,并且除非连接使用的是安全套接字层 (SSL)。 | |
false | 指定在传输 Cookie 时,安全连接不是必需的。默认值为 false。 | |
slidingExpiration | 指定是否启用弹性过期时间。在单个会话期间,弹性过期时间针对每个请求重置当前身份验证 Cookie 的过期时间。 | |
true | 指定启用弹性过期时间。在单个会话期间,身份验证 Cookie 被刷新,并且每个后续请求的到期时间被重置。ASP.NET 版本 1.0 的默认值为 true。 | |
false | 指定不启用弹性过期时间,并指定 Cookie 在最初发出之后,经过一段设定的时间间隔后失效。默认值为 false。 |
Authorization配置节
authorization用于设置应用程序的授权策略,容许或拒绝不同用户或角色访问,该配置可以在计算机,站点,应用程序,子目录或页等级别上声明必须与authentication配置节结合使用,“?”表示匿名(未经身份验证的用户)、“*”表示任何人,基本语法格式如下:
<pre name="code" class="html"> <authorization>
<deny users="?"/>
<allow users="Michael,Jack" roles="admin,user"/><!--用逗号分隔的用户列表及角色列表-->
<allow roles=""/>
</authorization>
在我的工程目录有这样一个目录,里面的文件只允许管理员成员访问,其它成员不能访问。
在此目录下创建配置文件,文件的内容如下:
<?xml version="1.0"?>
<configuration>
<system.web>
<!-- The authorization here allows only those users in the Administrator role to access the ASP.NET resources
in this folder... -->
<authorization>
<allow roles="Admin" />
<deny users="*" />
</authorization>
</system.web>
</configuration>