在Entity Framework Core中獲取當前用戶ID的正確方法

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

對於如何獲取當前登錄用戶的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)

使用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核心標識在startup.cs中通過DI注入 - 因此您只需通過構造函數注入UserManager

UserManager<ApplicationUser> userManager

然後,您可以在方法中使用以下內容

_userManager.GetUserId(User);

當您使用個人用戶帳戶創建新的ASP.NET Core 1項目時,這就是它在示例Web應用程序中的使用方式。


熱門答案

如果您使用Controller訪問它,那麼使用UserManager獲取用戶ID的效率非常低,因為您要往返數據庫。如果您使用的是ClaimsIdentity ,則可以執行以下操作來獲取用戶ID:

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

此方法只讀取已存在於cookie中的用戶ID,該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();

如果由於某種原因, 索賠集合中不存在所需的聲明 ,您可以在創建用戶的ClaimsIdentity時輕鬆添加它:

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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow