ASP.NET Core / MVC 6 / EF7でIdentityUserをどのように拡張するのですか?

asp.net-core asp.net-core-mvc asp.net-identity entity-framework-core

質問

私はアカウントに属するユーザーを持つサイトを構築しています。アカウントは、課金(アカウントに関連付けられている)または領収書(アカウントに関連付けられている)など、DB内のほとんどのデータの外部キーであるAccountIdによって識別されます。

ユーザーのAccountIdを取得するためにリポジトリにデータをポーリングする必要があるたびにDBを押すのではなく、AccountIdをクレームとして追加したいと考えました。目標は次のようなことをすることです。

_repository.GetAllChargesByAccountId(User.Identity.GetAccountId());

私はこれについてのちょっとしたヒントと部分的な解決策を見つけています。これらの例と私の特定の環境(ASP.NET Core RC1、MVC 6、EF7)の違いを解決することはできませんでした。

私は、ユーザーに関する属性を追加するためにIdentityUserからクラスを派生させました。

public class UserIdentity : IdentityUser {
    public static object Identity { get; internal set; }
    public int AccountId { get; set; }
}

私は自分のEFユーザーストアに使用しているIdentityDbContextから派生したUserIdentityContextを作成しました。

私は次のAuthControllerを持っています:

public class AuthController : Controller {
    private SignInManager<UserIdentity> _signInManager;

    public AuthController(SignInManager<UserIdentity> signInManager) {
        _signInManager = signInManager;
    }

    public IActionResult Login() {
        if (User.Identity.IsAuthenticated)
            return RedirectToAction("Dashboard", "App");

        return View();
    }

    [HttpPost]
    public async Task<ActionResult> Login(LoginViewModel vm, string returnUrl) {
        if (ModelState.IsValid) {
            var signInResult = await _signInManager.PasswordSignInAsync(vm.Username, vm.Password, true, false);
            if (signInResult.Succeeded) {
                if (String.IsNullOrWhiteSpace(returnUrl))
                    return RedirectToAction("Dashboard", "App");
                else return RedirectToAction(returnUrl);
            } else {
                ModelState.AddModelError("", "Username or password is incorrect.");
            }
        }   

        return View();
    }

    public async Task<IActionResult> Logout() {
        if (User.Identity.IsAuthenticated) {
            await _signInManager.SignOutAsync();
        }

        return RedirectToAction("Index", "App");
    }
}

他の投稿を見ると、私はIdentityExtensionを追加して、User.Identity.GetAccountId()としてリクエストにアクセスし、この回答のようにカスタムユーザーIDを生成する必要があるように思えます: User.Identityの利用可能なプロパティを拡張する方法これは古いバージョンで行われ、多くのメソッド呼び出しはもはや適用されません。

回答や指導に感謝します。

人気のある回答

AccountIdの主張を追加した場合は、簡単に拡張メソッドを作成して取得することができます。

public static string GetAccountId(this ClaimsPrincipal principal)
{
    if (principal == null)
    {
        throw new ArgumentNullException(nameof(principal));
    }
    var claim = principal.FindFirst("AccountId");
    return claim != null ? claim.Value : null;
}

カスタムクレームを追加する方法についてのヘルプが必要な場合は、 この質問をご覧ください



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ