2010-11-23 19 views
4

asp.net(.net 3.5)でユーザーを作成/更新するためのパスワードフィールドを検証したいと思います。パスワードはMembershipProviderに使用されます。MembershipProviderのパスワードバリデータ?

これを実装して、検証でメンバーシップ・プロバイダの構成設定を使用する最良の方法は何ですか?もちろん、私はコードを書くことができますが、これは基本的なもののように思えるので、それを行うにはドロップイン方法が必要です。

[編集]これは新しいユーザーやパスワードを変更するためのパスワードフィールドであることが明らかになりました。ValidateUserは役に立ちません。

答えて

2

私は答えはSqlMembershipProviderがパスワードを呼び出さないという事実に基づいて、ノーと言うでしょう(ChangePasswordおよびCreateUserメソッドの検証方法)。 Reflectorを使用すると、両方の方法で同じチェックセットを実行することがわかります(下記参照)。だから私はあなたがやっているようにあなた自身の関数を書くことが行く方法だと言うでしょう。

if (newPassword.Length < this.MinRequiredPasswordLength) 
{ 
    throw new ArgumentException(SR.GetString("Password_too_short", new object[] { "newPassword", this.MinRequiredPasswordLength.ToString(CultureInfo.InvariantCulture) })); 
} 
int num3 = 0; 
for (int i = 0; i < newPassword.Length; i++) 
{ 
    if (!char.IsLetterOrDigit(newPassword, i)) 
    { 
     num3++; 
    } 
} 
if (num3 < this.MinRequiredNonAlphanumericCharacters) 
{ 
    throw new ArgumentException(SR.GetString("Password_need_more_non_alpha_numeric_chars", new object[] { "newPassword", this.MinRequiredNonAlphanumericCharacters.ToString(CultureInfo.InvariantCulture) })); 
} 
if ((this.PasswordStrengthRegularExpression.Length > 0) && !Regex.IsMatch(newPassword, this.PasswordStrengthRegularExpression)) 
{ 
    throw new ArgumentException(SR.GetString("Password_does_not_match_regular_expression", new object[] { "newPassword" })); 
} 
+1

リフレクターを見るのにいいアイデア...ありがとう – tenfour

0

ロール独自のプロバイダは、内蔵された1から継承:

public class SqlMembershipProvider : System.Web.Security.SqlMembershipProvider 
{ 
    // called on login attempt 
    public override bool ValidateUser(string userName, string password) 
    { 
     // do your logic 

     // use built-in properties, parsed by base class for you, such as: 
     if (password.Length < this.MinRequiredPasswordLength) 
     { 
     } 

     //if ok, then: 
     base.ValidateUser(userName, password); 
    } 

    // called on new user creation attempt 
    public override MembershipUser CreateUser(string userName, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
    { 
     // do your logic 

     //if ok, then: 
     base.CreateUser(...); 
    } 
+0

私の現在の解決策は、確かに 'MembershipProvider'のプロパティに対してパスワードを検証する私自身の関数を書くことです。しかし、組み込みの方法があることを望んでいた。私はこれが新しいユーザ/ユーザの更新であることを明確にするために質問を更新したので、 'ValidateUser()'は役に立ちません。 – tenfour

+0

@tenfour:私のやり方では、新しいユーザーと古いユーザーの両方をチェックできます。更新された投稿 – abatishchev

0

あなたは検証によって正確に何を意味するのですか?

パスワードを特定の長さにする必要があり、それを複雑にする方法はありますが(例:6英数字、非英数字6文字)、件名のノートにはアクセスできません。

これはすべて、アプリケーション自体の設定ファイルで行われます。あなた自身の関数を使用する必要があることに同意する必要があります。デフォルトの動作を拡張したいと思うので、これをしない理由はありません。

私のメモはもっと深いですが、私が考えていたものを素早く検索しました。

<membership defaultProvider="SqlProvider" 
    userIsOnlineTimeWindow = "20> 
    <providers> 
    <add 
     name="SqlProvider" 
     type="System.Web.Security.SqlMembershipProvider" 
     connectionStringName="SqlServices" 
     requiresQuestionAndAnswer="true" 
     minRequiredPasswordLength="7" 
     minRequiredNonalphanumericCharacters="1" 
     /> 
    </providers> 
</membership> 

あなたはを超えて何かをしたい場合、私は明確にする必要があり、「指定したユーザー名とパスワードは、データ・ソースに存在することを確認します。」あなた自身のプロバイダが必要です。

私は正直にあなたがあなた自身のプロバイダを使用したくない理由を理解していない....

+0

を参照してください。プロバイダはすでに設定されています。 – tenfour

+0

@tenfourデフォルトのプロバイダは、ユーザが作成される前に、それらのルールに一致するパスワードを検証します。これらのルールを拡張したい場合、それを行う唯一の方法は、独自のプロバイダを使用することです。 –

+0

私は自分の質問をうまく説明していないと感じています。/新しいユーザーを作成したり、既存のユーザーのパスワードを変更したりするための入力検証について話しています。これは、ユーザーを管理するための管理ページ用です。ログインとは何の関係もありません。既に完全に設定された 'SqlMembershipProvider'を使用していますが、新しいユーザーを作成しようとする前に、ユーザーに検証エラーを提示したいと思います。希望を明確にするのに役立ちます。 – tenfour

関連する問題