17

メンバーシップシステムにASP.NET Identity 2を使用する新しいMVC 5カミソリ、EF 6 Web アプリケーションがあります。Web ページの [登録] リンクを使用して手動でユーザーを作成すると、うまくいきます。ユーザーを作成し、指定されたパスワードでログインしてからログアウトできます。

Identity 2 の移行でデータベース初期化子を使用する方法がわかりません。Identity 1 および他のアルファ版とベータ版には、人々を混乱させるだけの無数の例があります。まだわからないので、一時的な MVC ビューを使用してメンバーシップをインストールします。

ビューが適切に実行されていることがわかります。ユーザーとロール、およびデータベース内のユーザーとロールの関連付けが表示されます。また、ユーザーのレコードにハッシュ化されたパスワードがあることもわかります。

しかし、それを行った後、Create メソッドで使用したプレーン テキストのパスワードを使用して ID システム (ローカル) にログインできません。なぜですか? ところで、try/catch を省略し、ユーザーとロールの作成をチェックしました (エラーなしで実行されます)。

DbContext ctx = ApplicationDbContext.Create();
transaction = ctx.Database.BeginTransaction();
RoleManager<IdentityRole> roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(ctx));
var roleAdmin = roleManager.Create(new IdentityRole("Admin"));

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(ctx));
ApplicationUser userAdmin = new ApplicationUser { Id = "admin", Email = "me@there.com", UserName = "admin" };
            userManager.Create(userAdmin, "Test_2013");
userManager.AddToRole(userAdmin.Id, "Admin");
userManager.Update(userAdmin);

transaction.Commit(); 

その後、メール アドレスと Test_2013 のパスワードを使用してアカウントにログインしようとすると、ユーザー名/パスワードが正しくないことを示すエラーが表示されます。

4

3 に答える 3

39

実際のデータベース (Identity 2) と Web について多くの調査を行った結果、誰も知らなかったという結論に達しました :) 実際、何百万ものサイトが Identity に関する古い情報を持ち、さらにはすでに時代遅れになっている Identity 2.0 コードを配置しているため、掘り下げる必要がありました。 SQL Profiler と SQL Management Studio を使用して、さらに詳しく調べます。

Identity 2.0 には、nvarchar() であるが実際には Guid を含む Id プロパティがあります。なぜ Microsoft はそれを uniqueidentifier 型にしなかったのだろうか?! このプロパティをそのままにしておくべきだったときに設定していました(自動生成させます)。

同様に、Identity 2.0 には、ユーザー名を入力していた UserName フィールドがあります。UserName は Email と同じである必要があるようです。そうでない場合、ログインの試行は単に失敗します。

于 2014-06-16T21:51:44.297 に答える
24

私はまた、このストレスの問題に直面しました。AccountsController で作成されたデフォルトの Login メソッドを使用する必要があります。

 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

あなたはそれを見ることができます

"await SignInManager.PasswordSignInAsync( model.Email , model.Password, model.RememberMe, shouldLockout: false);"

最初のパラメーターとして電子メールが含まれていますが、PasswordSignInAsyncの定義を確認すると、最初のパラメーターとして電子メールではなくユーザー名を受け取る必要があることがわかります。

新しいユーザーを登録する方法では、両方のプロパティ (ユーザー名と電子メール) がユーザーが指定した電子メールの値と等しく設定されるため、デフォルトで機能します。ただし、新しいユーザーをプログラムで保存し、ユーザー名と電子メールを異なる値に設定した場合、ログインは失敗します。

これは間違いなく --> MS <--「私は彼らを信頼し、彼らのことを疑うまで何時間もかけてそれを機能させようとしました」

1) ログイン方法を変更して、最初の引数としてユーザー名を渡すようにします。Register メソッドを変更して、ユーザー名と電子メールを異なる値で保存します。それが他の誰かに役立つことを願っています。

于 2017-01-09T03:35:18.707 に答える
10

LoginViewModel に誤りがあります。Login メソッド (ポスト バージョン) を見ると、PasswordSignInAsync メソッドの最初のパラメーターはユーザー名である必要がありますが、loginViewModel では代わりに電子メールがあります。

PasswordSignInAsync は実際には最初のパラメーターを電子メール アドレスではなくユーザー名と見なしており、LoginViewModel の Email プロパティには電子メール バリデーターがあるため、明らかに正しく機能させることはできません。

たとえば、LoginViewModel の Email プロパティの名前を UserName に変更し、EmailAddress 注釈を削除する必要があります。

次に、対応するログイン ビューで、電子メール入力フィールドを置き換え、代わりに UserName を使用する必要があります。

次に、AccountController の login メソッドで、model.UserName を最初のパラメーターとして使用すると、正しく機能するはずです。

于 2015-06-08T15:40:37.503 に答える