ASP.NET核心身份 - 获得当前用户

问题描述:

获取当前登录的用户在MVC5,我们所要做的就是:现在ASP.NET核心身份 - 获得当前用户

using Microsoft.AspNet.Identity; 
    [Authorize] 
    public IHttpActionResult DoSomething() { 
     string currentUserId = User.Identity.GetUserId(); 
    } 

,与ASP.NET核心我认为这应该工作,但它会抛出一个错误。

using Microsoft.AspNetCore.Identity; 
    using Microsoft.AspNetCore.Http; 

    private readonly UserManager<ApplicationUser> _userManager; 
    [HttpPost] 
    [Authorize] 
    public async Task<IActionResult> StartSession() { 
     var curUser = await _userManager.GetUserAsync(HttpContext.User); 
    } 

任何想法?

编辑:赫拉尔的回应是正轨,只能获得实际的“ID”的用户,这似乎工作:

 ClaimsPrincipal currentUser = this.User; 
     var currentUserID = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value; 
+0

你的问题到底是什么? –

+0

你只需要Id?我编辑了我的答案,以添加如何使用更多花哨的_userManager.GetUserId(用户) –

+0

是的,主要是我需要AspNetUsers表中的Id或会话中的Id。 currentUser.FindFirst(ClaimTypes.NameIdentifier).Value使用声明给出Id。它也适用于UserManager!谢谢Gerardo!一种方法比另一种更有效吗? – jbraun

假设你的代码是一个MVC控制器内:

public class MyController : Microsoft.AspNetCore.Mvc.Controller 

Controller基类,可以从User财产得到IClaimsPrincipal

System.Security.Claims.ClaimsPrincipal currentUser = this.User; 

您可以直接检查索赔(不含往返于数据库):

bool IsAdmin = currentUser.IsInRole("Admin"); 
var id = _userManager.GetUserId(User); // Get user id: 

其他领域可以从数据库中的用户实体中获取:

  1. 使用获取用户管理依赖注入

    private UserManager<ApplicationUser> _userManager; 
    
    //class constructor 
    public MyController(UserManager<ApplicationUser> userManager) 
    { 
        _userManager = userManager; 
    } 
    
  2. 并使用它:

    var user = await _userManager.GetUserAsync(User); 
    var email = user.Email; 
    
+1

如果我在服务类中,而不是在控制器中,我没有用户属性?如何获得经过身份验证的用户的AppUser-Object? – Kirsten

+6

@Kirsten你可以通过依赖注入接收一个'IHttpContextAccessor',然后从http上下文获得'User'。只需将此参数添加到服务类构造函数:IHttpContextAccessor contextAccessor。将accessor放在字段'_contextAccessor'上,然后在服务方法上从'_contextAccessor.HttpContext.User'中获取。 –

+3

@Kirsten但是,这样做会将您的服务与ASP.NET Core结合在一起,使其无法在其他类型的场景中使用。这对你来说可能是可以接受的,或者不可以。我还会考虑在方法调用中正确传递您想要的服务。 –

在网络核心2.0用户已经存在作为底层继承控制器的一部分。只需像通常一样使用用户或传递给任何存储库代码即可。

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Policy = "TENANT")] 
     [HttpGet("issue-type-selection"), Produces("application/json")] 
     public async Task<IActionResult> IssueTypeSelection() 
     { 
      try 
      { 
       return new ObjectResult(await _item.IssueTypeSelection(User)); 
      } 
      catch (ExceptionNotFound) 
      { 
       Response.StatusCode = (int)HttpStatusCode.BadRequest; 
       return Json(new 
       { 
        error = "invalid_grant", 
        error_description = "Item Not Found" 
       }); 
      } 
     } 

这是它如果您使用的轴承令牌验证从

#region Assembly Microsoft.AspNetCore.Mvc.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 
// C:\Users\BhailDa\.nuget\packages\microsoft.aspnetcore.mvc.core\2.0.0\lib\netstandard2.0\Microsoft.AspNetCore.Mvc.Core.dll 
#endregion 

using System; 
using System.IO; 
using System.Linq.Expressions; 
using System.Runtime.CompilerServices; 
using System.Security.Claims; 
using System.Text; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Authentication; 
using Microsoft.AspNetCore.Http; 
using Microsoft.AspNetCore.Mvc.ModelBinding; 
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; 
using Microsoft.AspNetCore.Routing; 
using Microsoft.Net.Http.Headers; 

namespace Microsoft.AspNetCore.Mvc 
{ 
    // 
    // Summary: 
    //  A base class for an MVC controller without view support. 
    [Controller] 
    public abstract class ControllerBase 
    { 
     protected ControllerBase(); 

     // 
     // Summary: 
     //  Gets the System.Security.Claims.ClaimsPrincipal for user associated with the 
     //  executing action. 
     public ClaimsPrincipal User { get; } 

继承它,上述样品不返回应用用户。

相反,使用这样的:

ClaimsPrincipal currentUser = this.User; 
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value; 
ApplicationUser user = await _userManager.FindByNameAsync(currentUserName); 

这个作品在apsnetcore 2.0。在早期版本中没有尝试过。