現在ログインしているユーザーの 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;
}
}