我想知道如何针对现有的asp.net会员数据库验证用户的凭证。简短的故事是我们希望提供单点登录。
所以我做的是直接连接到成员资格数据库并尝试对aspnet_Membership表运行SQL查询:
private bool CanLogin(string userName, string password)
{
// Check DB to see if the credential is correct
try
{
string passwordHash = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "SHA1");
string sql = string.Format("select 1 from aspnet_Users a inner join aspnet_Membership b on a.UserId = b.UserId and a.applicationid = b.applicationid where a.username = '{0}' and b.password='{1}'", userName.ToLowerInvariant(), passwordHash);
using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString))
using (SqlCommand sqlCmd = new SqlCommand(sql, sqlConn))
{
sqlConn.Open();
int count = sqlCmd.ExecuteNonQuery();
return count == 1;
}
}
catch (Exception ex)
{
return false;
}
}
问题是密码值,有人知道密码是如何散列的吗?
答案 0 :(得分:1)
如果你在同一个IIS服务器上有两个asp.net应用程序,你可以像这样做SSO。我问了这个问题并自己回答了。
将两个应用程序指向您的asp_membership数据库后,将以下内容放入Web配置的system.web部分
<authentication mode="Forms" />
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="membership"
applicationName="/"
/>
</providers>
</membership>
<roleManager enabled="true" />
确保两者都具有相同的applicationname属性集。
我使用的是IIS 6,因此我将其配置为自动生成两个应用程序的计算机密钥。由于这两个应用程序都位于同一台机器上,因此密钥是相同的,这是使SSO工作的关键部分。设置IIS后,我的web.config
中添加了以下内容<machineKey decryptionKey="AutoGenerate" validation="SHA1" validationKey="AutoGenerate" />
这就是它的全部内容。完成后,我可以登录到app1,然后浏览到app2并保留我的安全凭据。
答案 1 :(得分:0)
问题是密码值, 有谁知道密码怎么样 是哈哈?
是的 - 你这样做!检查你的web.config文件,如下所示:
<membership defaultProvider="MembershipSqlProvider"
userIsOnlineTimeWindow="15">
<providers>
<add name="MembershipSqlProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web,
Version=1.2.3400.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
PasswordFormat="Hashed" />
</providers>
</membership>
PasswordFormat
正是您要找的。它可以具有以下三个值:
Clear
Encrypted
Hashed
并且,Microsoft将Hashed
的默认值设置为PasswordFormat
。
答案 2 :(得分:0)
为什么不通过System.Web.Security.Membership.ValidateUser()
自动检查?
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear />
<add name="MyMembershipProvider" type="MyApplication.MyMembershipProvider" connectionStringName="MyConnString" />
</providers>
</membership>
</system.web>
</configuration>