web-dev-qa-db-ja.com

CoreMVCのCookie内のクレームからユーザーIDを取得する

UserIdをASP.NETCoreMVCのCookieに保存したいと思います。どこからアクセスできますか?

ログイン:

var claims = new List<Claim> {
    new Claim(ClaimTypes.NameIdentifier, "testUserId")
};

var userIdentity = new ClaimsIdentity(claims, "webuser");
var userPrincipal = new ClaimsPrincipal(userIdentity);
HttpContext.Authentication.SignInAsync("Cookie", userPrincipal,
    new AuthenticationProperties
    {
        AllowRefresh = false
    });

ログアウト:

User.Identity.GetUserId(); // <-- 'GetUserId()' doesn't exists!?

ClaimsPrincipal user = User;
var userName = user.Identity.Name; // <-- Is null.

HttpContext.Authentication.SignOutAsync("Cookie");

MVC 5で可能です------------------->

ログイン:

// Create User Cookie
var claims = new List<Claim>{
        new Claim(ClaimTypes.NameIdentifier, webUser.Sid)
    };

var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignIn(
    new AuthenticationProperties
    {
        AllowRefresh = true // TODO 
    },
    new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie)
);

ユーザーIDの取得:

public ActionResult TestUserId()
{
    IPrincipal iPrincipalUser = User;
    var userId = User.Identity.GetUserId(); // <-- Working
}

更新-nullであるクレームのスクリーンショットを追加-------

userIdnullです。

enter image description here

6
radbyx

HttpContextを介して取得できるはずです。

var userId = context.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value;

例ではcontextはHttpContextです。

Startup.cs(テンプレートWebサイトと同様の基本):

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();
    services.AddMvc();
}

public void Configure(IApplicationBuilder app)
{
    app.UseIdentity();
    app.UseMvc();
}
11
kloarubeek

FindFirst メソッドを使用して ClaimsPrincipal クラス:

var userId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;

4
Andriy Tolstoy