2012-01-27 12 views
3

今までMVC3アプリですべての認証作業を行った、つまりメンバを検証して、私のMemberRepositoryクラスを通してメンバを作成しました。今私は公式に行くつもりです、カスタムはMembershipProviderです。これまでは、このクラスのValidateUserメソッドをオーバーライドする必要があり、Loginコントロールを使用していないので、絶対にこれを行う必要があるかどうかはわかりません。 GetUserCreateUserのようなメソッドをオーバーライドMVC3でオーバーライドするMembershipProviderの量

は私が細かく細工Memberクラスを持っているMembershipUser、のように、私のパーティーに招かれざる種類をもたらします。組み込みのコントロールや管理ツールを使用しない場合は、カスタムメンバーシッププロバイダが本当に必要かどうかに関わらず、誰かが私のためにクリアすることができますか?そうした場合、私のオーバーライドを絶対に必要なものに限定するべきですかそれは何ですか?

+1

[カスタムメンバーシッププロバイダの作成](http://msdn.microsoft.com/en-us/library/ie/f1kyba5e.aspx) –

+0

ありがとう@ロバーツ、しかし、私の質問には答えません。カスタムメンバーシッププロバイダを作成する方法を知っており、ベースメソッドをオーバーライドするためにどれくらいの時間を要しているかを尋ねています。 NotImplementedExceptionにそれらを残しておけば、私はそれを行うことができます。本当にカスタムプロバイダが必要ですか? – ProfK

答えて

1

カスタムのMembershipProvider

あなたがのMembershipProviderを使用している場合は、「自由のための」いくつかの素晴らしいのセキュリティ機能を得ることが可能である:あなたは、ログインするすべての非認証されたユーザーをリダイレクトするようにweb.configファイルを設定することができます例えば、ページ。または、特定の役割を持つユーザーだけに表示されるようにサイトの特定の部分を設定することもできます。これらの機能がプロジェクトにとって意味をなさない場合や、すでに同等の機能を別の方法で実装している場合は、カスタムMembershipProviderを実装することはあまりありません。あなたが検討する必要があります

SqlMembershipProvider

もう一つの可能​​性は実際にメンバーシップ関数を処理するためにSqlMembershipProviderを使用するために独自の実装を切り替えています。

SqlMembershipProviderは、アカウントの作成、検証、削除、ロック、パスワードのリセット、基本的な役割など、すべてのプロジェクトを再考する必要がある一般的なタスクに対して、堅牢で実績のあるプラットフォームを提供します。これらすべてあなた自身なしで、SqlMembershipProviderを使用すると、実際にそれを持つために作成するポイントはありません。しかし、自分の実装に間違ったことをした可能性が高いので、注意する必要があります。たとえば、

  • パスワードをプレーンテキストまたはハッシュ形式で保存していますか?
  • あなたはRainbow Table攻撃に公開されていますか、あなたのハッシュを塩漬けしていますか?
  • 連続して50回ほどパスワードの試行が間違っているのを見た後に人のアカウントをロックするのですか、またはハッカーを誰かのアカウントに無理矢理強要するまで、

SqlMembershipProviderは、既にこれらの問題すべてを容易に構成可能な方法で処理しています。独自のメンバシップインターフェイスを持つことが必要な場合があります。これらのさまざまな懸念を気にする必要がないように、DTOはこのデフォルトのMembershipProviderを単にラップします。そうすれば、ほとんどのコードはこれらの「招待されていないタイプ」と対話する必要はありませんが、バックエンドで広く使用されている実績のあるセキュリティフレームワークの利点があります。

+0

あなたはそれをうまくまとめたと思う、ありがとう。私はカスタムプロバイダーもSqlProviderも必要ありませんが、多くの場合、そのプロバイダーと良い点があります。 – ProfK

2

ここに私が単体テスト用に書いたものがあります。それはできるだけ少ない程度です。

public class MockMembershipProvider : MembershipProvider 
{ 
    public IList<MembershipUser> Users { get; private set; } 

    private string _applicationName; 
    public override string ApplicationName 
    { 
     get 
     { 
      return _applicationName; 
     } 
     set 
     { 
      _applicationName = value; 
     } 
    } 

    public override bool ChangePassword(string username, string oldPassword, string newPassword) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override MembershipUser CreateUser(
     string username, 
     string password, 
     string email, 
     string passwordQuestion, 
     string passwordAnswer, 
     bool isApproved, 
     object providerUserKey, 
     out MembershipCreateStatus status) 
    { 
     var user = new MembershipUser(ProviderName, username, username, email, passwordQuestion, null, isApproved, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now); 
     Users.Add(user); 
     status = MembershipCreateStatus.Success; 
     return user; 
    } 

    public override bool DeleteUser(string username, bool deleteAllRelatedData) 
    { 
     var u = Users.Where(mu => mu.UserName.Equals(username, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); 
     if (u == null) return false; 
     Users.Remove(u); 
     return true; 
    } 

    public override bool EnablePasswordReset 
    { 
     get { return false; } 
    } 

    public override bool EnablePasswordRetrieval 
    { 
     get { return false; } 
    } 

    public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) 
    { 
     throw new NotImplementedException(); 
    } 

    public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) 
    { 
     var users = (from u in Users 
        where u.UserName.Equals(usernameToMatch, StringComparison.OrdinalIgnoreCase) 
        select u).ToList(); 
     totalRecords = users.Count; 
     return ToMembershipUserCollection(users); 
    } 

    public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) 
    { 
     var list = Users.Skip(pageIndex * pageSize).Take(pageSize); 
     totalRecords = list.Count(); 
     var result = new MembershipUserCollection(); 
     foreach (var u in list) 
     { 
      result.Add(u); 
     } 
     return result; 
    } 

    public override int GetNumberOfUsersOnline() 
    { 
     return Users.Count(); 
    } 

    public override string GetPassword(string username, string answer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) 
    { 
     return (from u in Users 
       where u.ProviderUserKey.ToString() == providerUserKey.ToString() 
       select u).FirstOrDefault(); 
    } 

    public override MembershipUser GetUser(string username, bool userIsOnline) 
    { 
     return (from u in Users 
       where u.UserName.Equals(username, StringComparison.OrdinalIgnoreCase) 
       select u).FirstOrDefault(); 
    } 

    public override string GetUserNameByEmail(string email) 
    { 
     return (from u in Users 
       where u.Email.Equals(email, StringComparison.OrdinalIgnoreCase) 
       select u.UserName).FirstOrDefault(); 
    } 

    public override int MaxInvalidPasswordAttempts 
    { 
     get { return 3; } 
    } 

    public override int MinRequiredNonAlphanumericCharacters 
    { 
     get { return 1; } 
    } 

    public override int MinRequiredPasswordLength 
    { 
     get { return 6; } 
    } 

    public override int PasswordAttemptWindow 
    { 
     get { return 10; } 
    } 

    public override MembershipPasswordFormat PasswordFormat 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public override string PasswordStrengthRegularExpression 
    { 
     get { return null; } 
    } 

    public override string Name 
    { 
     get 
     { 
      return ProviderName; 
     } 
    } 

    public string ProviderName { get; set; } 

    public override string ResetPassword(string username, string answer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool RequiresQuestionAndAnswer 
    { 
     get { return false; } 
    } 

    public override bool RequiresUniqueEmail 
    { 
     get { return true; } 
    } 

    private MembershipUserCollection ToMembershipUserCollection(IEnumerable<MembershipUser> users) 
    { 
     var result = new MembershipUserCollection(); 
     foreach (var u in users) 
     { 
      result.Add(u); 
     } 
     return result; 
    } 

    public override bool UnlockUser(string userName) 
    { 
     return true; 
    } 

    public override void UpdateUser(MembershipUser user) 
    { 
     var oldUser = Users.Where(u => u.UserName.Equals(user.UserName, StringComparison.OrdinalIgnoreCase)).Single(); 
     var index = Users.IndexOf(oldUser); 
     Users[index] = user; 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     throw new NotImplementedException(); 
    } 

    public MockMembershipProvider() 
    { 
     this.ProviderName = "MockMembershipProvider"; 
     Users = new List<MembershipUser>(); 
    } 
} 

public class FakeMembershipProvider : MockMembershipProvider 
{ 
    public FakeMembershipProvider(string name) 
    { 
     this.ProviderName = name ?? "MockMembershipProvider"; 
    } 
    public override MembershipUser CreateUser(
     string username, 
     string password, 
     string email, 
     string passwordQuestion, 
     string passwordAnswer, 
     bool isApproved, 
     object providerUserKey, 
     out MembershipCreateStatus status) 
    { 
     status = MembershipCreateStatus.ProviderError; 
     var user = new MockMembershipUser(); 
     user.Password = password; 
     user.User = username; 
     user.UserKey = providerUserKey; 
     Users.Add(user); 
     status = MembershipCreateStatus.Success; 
     return user; 
    } 
} 

public class MockMembershipUser : MembershipUser 
{ 
    public string Password { get; set; } 
    public string User { get; set; } 
    public object UserKey { get; set; } 

    public override string UserName { get { return User; } } 

    public override string Comment { get; set; } 

    public override object ProviderUserKey { get { return UserKey; } } 

    public override string GetPassword() 
    { 
     return Password ?? string.Empty; 
    } 
1

MembershipRepositoryからウェブアプリケーションをデカップリングしますか?

custom MembershipProviderに同じ機能を実装すると、アプリケーションは(web.configのほかに)Membership classesという.NETにのみ依存するようになります。

もしそうでなければ、気にしないでください。

+0

> MembershipRepositoryからWebアプリケーションを切り離しますか? いいえ、それ以上のDIは既にありません。私はちょうどプロバイダのどこかに何かが必要な印象を受けました。 – ProfK

+0

ログインコントロールはデフォルトでデフォルトのMembershipProviderを使用しますが、簡単にオーバーライドできます。また、メンバーシップヘルパークラス(および同様のロール)を使用したくない場合は、カスタムプロバイダを作成して何かを得ることはできません。 – jrummell

関連する問題