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注入 - 因此您只需通过构造函数注入UserManager
UserManager<ApplicationUser> userManager
Run Code Online (Sandbox Code Playgroud)
然后,您可以在方法中使用以下内容
_userManager.GetUserId(User);
Run Code Online (Sandbox Code Playgroud)
当您使用个人用户帐户创建新的ASP.NET Core 1项目时,这就是它在示例Web应用程序中使用的方式.
归档时间: |
|
查看次数: |
13060 次 |
最近记录: |