13

次の機能のソリューション (サンプル コード) を持っている人はいますか?

  • randomGuid/暗号的に強力な乱数を作成する
  • 乱数を含む一意の URL をユーザーのメール アドレスに送信します。
  • 確認すると、ユーザーはパスワードの変更を求められます

私のプロバイダーは現在、次のようにパラメーター化されています。

enablePasswordRetrieval="false" 
enablePasswordReset="true" 
requiresQuestionAndAnswer="false" 
applicationName="/" 
requiresUniqueEmail="true" 
passwordFormat="Hashed" 
maxInvalidPasswordAttempts="5" 
minRequiredPasswordLength="5" 
minRequiredNonalphanumericCharacters="0" 
passwordAttemptWindow="10" 
passwordStrengthRegularExpression="" 
name="AspNetSqlMembershipProvider"

このタイプの手順に伴うセキュリティの問題は、以前にここで説明されています。

4

2 に答える 2

5

Rui、私は数ヶ月前に同様のボートに乗っていましたが、以前はメンバーシッププロバイダーにあまり触れていなかったので、適切に実装するのに苦労しました。すべてをそのまま実装して使用する必要があると思ったからです、またはまったく何もありません。

オブジェクト全体ではなく、その一部しか使用できないことがすぐにわかりました。たとえば、私のアプリケーションには、独自のユーザー オブジェクトと独自のパスワードおよびログイン モジュールがありますが、フォーム認証を機能させる必要がありました。したがって、基本的には、その部分にメンバーシップ プロバイダーを使用するだけです。FormsAuthentication に使用するだけで、独自のリポジトリを使用してパスワードを変更したり、ユーザー名のパスワードを確認したりします。

これは、MVC のログイン コードのスニペットです。

   var authTicket =  new FormsAuthenticationTicket(1, user.UniqueName, DateTime.UtcNow, DateTime.UtcNow.AddHours(2), rememberMe, cookieValues);
    var encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Expires = DateTime.UtcNow.AddDays(14) };

    httpResponseBase.Cookies.Add(authCookie);

これにより、FormsAuthentication.SignOut(); を使用できるようになります。メンバシップ プロバイダが提供するメソッドおよびその他のメソッド。

あなたの質問について、randomGuid/Cryptographically strong random number を作成します。これは、使用できる良い方法です。少し前に見つけました。申し訳ありませんが、Web のどこにあるか思い出せません。

/// <summary>
/// A simple class which can be used to generate "unguessable" verifier values.
/// </summary>
public class UnguessableGenerator
{
    const string AllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/^()";
    const string SimpleAllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    /// <summary>
    /// Generates an unguessable string sequence of a certain length
    /// </summary>
    /// <param name="length">The length.</param>
    /// <param name="useSimpleCharacterSet">if set to <c>true</c> [use simple character set].</param>
    /// <returns></returns>
    public static string GenerateUnguessable(int length, bool useSimpleCharacterSet = false, string additionalCharacters = "")
    {
        var random = new Random();

        var chars = new char[length];

        var charsToUse = useSimpleCharacterSet ? SimpleAllowableCharacters : AllowableCharacters;
        charsToUse = string.Format("{0}{1}", charsToUse, additionalCharacters);

        var allowableLength = charsToUse.Length;

        for (var i = 0; i < length; i++)
        {
            chars[i] = charsToUse[random.Next(allowableLength)];
        }

        return new string(chars);
    }




    /// <summary>
    /// Generates an ungessable string, defaults the length to what google uses (24 characters)
    /// </summary>
    /// <returns></returns>
    public static string GenerateUnguessable()
    {
        return GenerateUnguessable(24);
    }
}

乱数を含む一意の URL をユーザーの電子メール アドレスに送信する場合、ユーザー テーブルまたは任意のテーブルに、ランダム ID を格納し、それをユーザーが使用できる電子メールの細工された URL で使用する方法が必要です。確認。

これには、そのタイプの Url を受け入れる Url を作成する必要があります。次に、クエリ文字列から必要な部分を抽出し、ユーザー オブジェクトを更新する必要があります。

確認されると、ユーザーはパスワードの変更を求められます。デフォルトでは、ユーザーにパスワードの変更を強制するビットフラグがテーブルに含まれています。これは、後でユーザーにパスワードの変更を強制する必要がある場合にも役立ちます。そのため、ログイン コードは、このビット フラグがオンになっているかどうかを確認し、オンになっている場合は、最初にパスワードの変更を強制します。次に、ユーザーがパスワードを変更したら、このフラグをオフにします。

お役に立てれば。

于 2010-07-01T23:50:09.827 に答える
1

少なくとも、guid には Guid クラスを使用してください。結果をカスタマイズできる場合があります

var guid = Guid.NewGuid();

..... リンクを送信するには

var msg = new MailMessage();
msg.From = new MailAddress("YOUR_ADDRESS");
msg.To.Add(new MailAddress("CLIENT_ADDRESS"));
msg.Subject = "YOUR SUBJECT";
msg.Body = @" SOME TXT.... http:\\resetPassword.aspx?guid=" + guid;
var smtpClient = new SmtpClient("SMTP_SERVER", 9990);
smtpClient.Send(msg);

.....

resetPassword.aspx のような Web ページを実行し、ページで処理するだけで、データベース内のユーザーにリンクする必要があるパラメーター「guid」をロードします。

于 2010-07-07T13:35:33.627 に答える