web-dev-qa-db-ja.com

Asp.NET Identityカスタムサインインマネージャー

私のアプリケーションでは、ユーザーがログインするための条件を追加したいと思います。たとえば、管理者は何らかの理由でユーザーアカウントを「ロック」することができます。アカウントがロックされている場合、ユーザーはログインできません。ログイン試行が複数回失敗したため、「ロックアウト」の場合とは異なります。ロック状態は管理者によって削除される可能性があります。

デフォルトのテンプレートは、デフォルトから派生するApplicationSignInManagerを作成することがわかります。

public class ApplicationSignInManager : SignInManager<User, string>

「アカウント」コントローラー呼び出しからの「ログイン」アクション

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

だから私の試みはこの関数をオーバーライドすることです

public override async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
    User user = this.UserManager.FindByName(userName);
    if (null != user)
    {
        if (true == user.AccountLocked)
        {
            return (SignInStatus.LockedOut);
        }
    }

    var result = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);

    return (result);
}

これには2つの問題があります。まず、「userName」はユーザーごとに一意であると想定しています。ただし、これは安全に想定できます。

次に、この関数は実質的に、Asp.net Identityで定義されているSignInStatusを返します。ログインが失敗する可能性のある適切な理由を伝えるために、その他を返すように変更することはできません。

誰かがこれに良い解決策を提供できますか?

13
phandinhlan

オーバーライドする代わりに、単に別のメソッドを作成しないのはなぜですか?あなたのメソッドはあなたが知る必要があるものを返します-アカウントが実際にログインしているか管理者によって無効にされているかを知るオブジェクトを返します( "無効"の方が良い名前だと思います-混乱を避けます)。そして、コントローラーを変更して、標準のPasswordSignInの代わりに新しいメソッドを使用します。

ユーザー名の一意性について-はい、ユーザー名は一意です-これがユーザーがサインインできる唯一の方法です。そうでなければ、同じユーザー名を持つ2つのアカウントがある場合、システムはどのアカウントに対してパスワードを試すかをどのようにして知るのでしょうか?

14
trailmax