web-dev-qa-db-ja.com

ASPでログインすると、「許可されていません」で毎回IDが失敗します(「email」と「username」の値が同じ場合でも))

次の行を介してログインするため、ユーザーの登録は正常に機能します。

await _signInManager.SignInAsync(user, isPersistent: model.RememberMe);

しかし、同じユーザーで再度ログインしたい場合は機能しません(タスク結果は常に「許可されていません」を返しました)。

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: true);

私はPasswordSignInAsyncがEMAILではなくUSERNAMEを期待していることを理解しています-しかし、それらは私のアプリケーションにとってまったく同じです。

ユーザーとパスワードが正しいかどうかの確認(すべて成功)、ユーザーオブジェクトの引き渡し、ViewModelプロパティ名の変更など、さまざまなログインメソッドを試しました。

何を変える必要があるか?

コンテキストに関する同様の問題: ASP.NET IDプロバイダーSignInManagerが失敗を返し続ける

ありがとうございました。

12
Rhonage

わかりました。ここでソースコードを確認しました- https://github.com/aspnet/Identity/blob/dev/src/Identity/SignInManager.cs

NotAllowedはここでのみ設定されます。

        protected virtual async Task<SignInResult> PreSignInCheck(TUser user)
        {
            if (!await CanSignInAsync(user))
            {
                return SignInResult.NotAllowed;
            }
            if (await IsLockedOut(user))
            {
                return await LockedOut(user);
            }
            return null;
}

CanSignInAsyncにドリルダウンしました...

public virtual async Task<bool> CanSignInAsync(TUser user)
        {
            if (Options.SignIn.RequireConfirmedEmail && !(await UserManager.IsEmailConfirmedAsync(user)))
            {
                Logger.LogWarning(0, "User {userId} cannot sign in without a confirmed email.", await UserManager.GetUserIdAsync(user));
                return false;
            }
            if (Options.SignIn.RequireConfirmedPhoneNumber && !(await UserManager.IsPhoneNumberConfirmedAsync(user)))
            {
                Logger.LogWarning(1, "User {userId} cannot sign in without a confirmed phone number.", await UserManager.GetUserIdAsync(user));
                return false;
            }

            return true;
}

ああ、私はこれがどこへ向かっているのか知っています。 Startup.cs設定を見てみましょう。

services.Configure<IdentityOptions>(options =>
{
    ...
    options.SignIn.RequireConfirmedEmail = true;
    ...
}

ああ、そうか。

私がしなければならないことは、データベースにポップして、ユーザーをEmailConfirmed = trueに設定することだけでした。 PEBCAK。

「許可されていません」は理にかなっていますが、それに伴うエラーメッセージはありませんでした。そのため、何が起こっているのかを知るための最良の方法ではありませんでした。幸い、.NET Coreはソースコードを簡単に掘り下げることができます。

これが誰かを助けることを願っています。

11
Rhonage

最初に、LoginViewModelのemailプロパティに正しい表示属性を追加していることを確認する必要があります。これにより、メールアドレスではない入力に気づいたときに表示属性が爆発しないようにします。

    [Required]
    [Display(Name = "Username/Email")]
    public string Email { get; set; 

次に、PasswordSignInAsyncメソッドのmodel.Emailの代わりに、次のようにuser.UserNameを使用します。

var result = await _signInManager.PasswordSignInAsync(userName, model.Password, model.RememberMe, lockoutOnFailure: false);
0

確認メールを追加していない場合は、Startup.cs設定を確認してください。

services.Configure<IdentityOptions>(options =>
{
    //...
    options.SignIn.RequireConfirmedEmail = false;
    //...
}

falseである必要がありますこれが問題の原因です。

0