0

私はASP.NET MVC 3 Webサイトを作成しています。これは私のカスタムのMembershipProvider(唯一のvalidateUserが実現)である:ログオンアクションのIIS 7.0でカスタムMembershipProviderとRoleproviderを使用する

public class RFMMembershipProvider : MembershipProvider 
{ 
    IUserService userService = new UserService(); 

    public override bool ValidateUser(string username, string password) 
    { 
     return password.GetHashCode().ToString() == userService.GetUser(username).Pass; 
    } 
... 
} 

と私のRoleprovider(のみGetRolesForUserを実現)

public class RFMRoleProvider : RoleProvider 
{ 
    IUserService userService = new UserService(); 

    public override string[] GetRolesForUser(string username) 
    { 
     return new string[] { userService.GetRolesForUser(username).Name }; 
    } 
... 
} 

私のweb.config一部

... 
<system.web> 

<roleManager enabled="true" defaultProvider="RFMRoleProvider"> 
    <providers> 
    <clear/> 
    <add name="RFMRoleProvider" type="RFMSite.WebUI.RFMRoleProvider, RFMSite"/> 
    </providers> 
</roleManager> 

<membership defaultProvider="RFMMembershipProvider" 
      > 
    <providers> 
    <clear/> 
    <add name="RFMMembershipProvider" 
     type="RFMSite.WebUI.RFMMembershipProvider, RFMSite" 
     /> 
    </providers> 
</membership> 

<authentication mode="Forms" > 
    <forms loginUrl="~/Account/LogOn" timeout="2880"> 
    </forms> 
</authentication> 

... 
if (Membership.ValidateUser(username, password)) 
      { 
       FormsAuthentication.SetAuthCookie(username, true); 
       return RedirectToAction("Files", "Admin"); 
      } 
... 
return View(); 

質問はなぜ私がIIS 7.0でサイトを公開するときですMembership.ValidateUser(username, password) は常にfalseを返しますか?ローカルasp.net開発サーバーで正常に動作します。 MSSQL Serverとの接続はOKです(ウェブサイトの展開時にデータを取得して表示できます)。例外は発生せず、常にfalseを返します。

答えて

0

正確に同じコードをローカルおよび本番環境で使用していますか?私はあなたのコードが偶然によって以外で動作することは疑わしいです。

具体的には、String.GetHashCode()は、ユーザーが自分のパスワードに長い乱数を使用しない限り、データベースのパスワードに一致するものを返すことはありません。 GetHashCodeは、パスワードを保護するためではなく、ハッシュテーブルを構築するためのものです。私はあなたがHashPasswordForStoringInConfigFile、またはそれに似たものと混同していると思います。明確にするため

EDIT:

私はGetHashCodeがあなたの問題ですが、私は何かが明らかに間違って表示されていないことを確かに知りません。いずれにせよ一時的なので(コメントに書いてあるように)、ハッシュコードをログファイルに記録するのは簡単です。

はい、GetHashCodeはデプロイ時に簡単に変更できます。たとえば、別のアーキテクチャを実行している場合、または新しいバージョンのFrameworkに対してGetHashCodeから返される正確な値は、まったく異なる場合があります。

+0

私はpass.GetHashCode()ToString()と実際にデータベースにデータを書き込みます。私はそれが悪い考えであると理解しています。そのような解決策は一時的です。そして、GetHashCode()メソッドは、IISでdelpoyedされたときに別の文字列を返すことを意味しますか? –

+0

私は、GetHashCodeの実装はあなたが頼りにするべきものではないことを意味します。フレームワークのさまざまなバージョン、エディション、アーキテクチャなどが変更することができます。これは完全に実装レベルの内部的な詳細です。それ以外にも、これらのハッシュコードはユニークではありません。衝突はハッシュテーブルの通常の部分なので、同じバケットにハッシュする複数のパスワードを簡単に作成できます。 –

+0

ええ、great thanx !!あなたは本当に正しかった! GetHashCode()fjr Webサイトがiisとasp.net webdevサーバーでホストされている場合、同じ文字列が異なる値を返します –

0

この目的でGetHashCodeを使用しないでください!常に同じMD5またはSHA1セキュリティハッシュを使用してください。 GetHashCodecan return different values between different versions of .NET framework。また、32ビットおよび64ビットシステムで使用すると、異なる値を返します。

+0

thanx!あなたが正しいです。 –

関連する問題