2016-08-03 132 views
21

獲取當前登錄的用戶在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

回答

44

假設你的代碼是一個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結合在一起,使其無法在其他類型的場景中使用。這對你來說可能是可以接受的,或者不可以。我還會考慮在方法調用中正確傳遞您想要的服務。 –

0

在網絡核心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; } 
0

繼承它,上述樣品不返回應用用戶。

相反,使用這樣的:

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

這個作品在apsnetcore 2.0。在早期版本中沒有嘗試過。

相關問題