Entity Frameworkコアで現在のユーザーIDを取得する適切な方法

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

質問

現在ログインしているユーザーのIDを取得する方法については、さまざまなRCコアのASP.NETコアについてさまざまな回答が寄せられています。ここで明確な質問をしたかったのです。 project.jsonに「Microsoft.AspNetCore.Identity.EntityFrameworkCore」が追加されました:「1.0.0」

RC1を使用すると、次のようなことができます。

using Microsoft.AspNet.Identity;
using System.Security.Claims;

User.GetUserId();

しかし、新しくリリースされたバージョン1のEFコアでは、Microsoft.AspNet.Identityは適切なバージョンではありません。

UserManagerを使用するための提案がありました。これは、現在ログインしているユーザーを取得するだけのようです。

private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);

var user = await GetCurrentUserAsync();
var userId = user?.Id;

私が見つけたもう一つの方法は:

private readonly UserManager<ApplicationUser> _userManager;
_userManager.GetUserId(User)

したがって、ASP.NET Core 1 RTMとEF Core 1では、project.jsonに以下のライブラリがありますが、現在ログインしているユーザーのIDを取得する適切な方法は何ですか?

"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
"Microsoft.AspNetCore.Mvc": "1.0.0",

受け入れられた回答

ASP.NET Core Identityはstartup.csのDIを介して注入されます。コンストラクタを介してUserManagerを注入するだけです

UserManager<ApplicationUser> userManager

次に、メソッド内で次のものを使用できます

_userManager.GetUserId(User);

それは、個々のユーザーアカウントで新しいASP.NET Core 1プロジェクトを作成するときにサンプルWebアプリケーションで使用される方法です。


人気のある回答

コントローラを使用してこれにアクセスしている場合は、 UserManagerを使用してユーザーIDを取得すると、データベースへの往復を行う際に非常に効率が悪くなります。 ClaimsIdentityを使用している場合は、次のようにしてユーザーIDを取得できます。

var claimsIdentity = (ClaimsIdentity)this.User.Identity;
var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
var userId = claim.Value;

このメソッドは、クッキーにすでに存在するユーザーIDを読み取るだけで、自動的にデシリアライズされ、 ClaimsIdentityインスタンスに格納されます。

私はこのヘルパークラスを使用します:

public static class UserHelpers
{
    public static string GetUserId(this IPrincipal principal)
    {
        var claimsIdentity = (ClaimsIdentity)principal.Identity;
        var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
        return claim.Value;
    }
}

だから、ユーザーIDを取得する:

var userId = this.User.GetUserId();

何らかの理由で、要求されたクレームがクレームのコラボレーションに存在しない場合は、ユーザーのクレームアイデンティティを作成するときにクレームを簡単に追加できます。

public class ApplicaionUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        userIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, this.UserId));
        return userIdentity;
    }
}


Related

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