在Entity Framework Core中获取当前用户ID的正确方法

Rez*_*eza 18 asp.net-identity entity-framework-core asp.net-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();
Run Code Online (Sandbox Code Playgroud)

但是随着EF Core新发布的第1版,Microsoft.AspNet.Identity不是正确的版本.

有人建议使用UserManager,这对于获取当前登录的用户来说似乎很多:

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

var user = await GetCurrentUserAsync();
var userId = user?.Id;
Run Code Online (Sandbox Code Playgroud)

我发现的另一种方法是:

private readonly UserManager<ApplicationUser> _userManager;
_userManager.GetUserId(User)
Run Code Online (Sandbox Code Playgroud)

使用ASP.NET Core 1 RTM和EF Core 1以及project.json中的以下库,获取当前登录用户的id的正确方法是什么?

"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
"Microsoft.AspNetCore.Mvc": "1.0.0",
Run Code Online (Sandbox Code Playgroud)

Mil*_*vic 23

如果您使用Controller访问它,那么使用UserManager获取用户ID的效率非常低,因为您要往返数据库.如果您使用的是ClaimsIdentity,则可以执行以下操作来获取用户ID:

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

此方法只读取已存在于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此获取用户ID成为:

var userId = this.User.GetUserId();
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因,索赔集合中不存在所需的声明,您可以在创建用户的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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Rez*_*eza 15

ASP.NET核心标识在startup.cs中通过DI注入 - 因此您只需通过构造函数注入Us​​erManager

UserManager<ApplicationUser> userManager
Run Code Online (Sandbox Code Playgroud)

然后,您可以在方法中使用以下内容

_userManager.GetUserId(User);
Run Code Online (Sandbox Code Playgroud)

当您使用个人用户帐户创建新的ASP.NET Core 1项目时,这就是它在示例Web应用程序中使用的方式.