2010-05-18 77 views
2

我想知道如何根据现有的asp.net会员数据库验证用户的凭证。简而言之,我们希望提供访问的单一标志。如何根据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; 
    }  
} 

的问题是密码值,没有人知道如何密码它是散列?

回答

1

如果在同一个IIS服务器上有两个asp.net应用程序,那么可以这样做SSO。我问了这个问题并且自己回答了。

here

一旦你有两个应用程序在你的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并保留我的安全凭证。

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

而且,微软设定的默认值HashedPasswordFormat

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> 
+0

你知道什么web.config设置是必需的吗?我们无法将身份验证模式更改为表单,因为这会破坏SharePoint网站 – Ekk 2010-05-18 10:20:01

+0

@Ekk:我编辑了我的答案 – abatishchev 2010-05-18 11:47:03

相关问题