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

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

現在ログインしているユーザーの ID を取得する方法については、ASP.NET Core のさまざまな RC についてさまざまな回答がここに出回っています。ここで明確な質問をしたいと思いました。project.json には現在 "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0" があることに注意してください。

RC1 では、次のようなことができます。

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

User.GetUserId();

しかし、新しくリリースされた EF Core バージョン 1 では、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)

では、project.json に次のライブラリが含まれる ASP.NET Core 1 RTM および EF Core 1 では、現在ログインしているユーザーの ID を取得する適切な方法は何でしょうか?

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

ベストアンサー1

コントローラー内からこれにアクセスする場合は、ユーザーマネージャーユーザーIDを取得するには、データベースへの往復が必要になるため、非常に非効率的です。クレームアイデンティティユーザー ID を取得するには、次のようにします。

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

このメソッドは、クッキーに既に存在するユーザーIDを読み取り、自動的に逆シリアル化されてクレームアイデンティティ実例。

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

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;
    }
}

おすすめ記事