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;
假设你的代码是一个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:
其他领域可以从数据库中的用户实体中获取:
-
使用获取用户管理依赖注入
private UserManager<ApplicationUser> _userManager; //class constructor public MyController(UserManager<ApplicationUser> userManager) { _userManager = userManager; }
-
并使用它:
var user = await _userManager.GetUserAsync(User); var email = user.Email;
如果我在服务类中,而不是在控制器中,我没有用户属性?如何获得经过身份验证的用户的AppUser-Object? – Kirsten
@Kirsten你可以通过依赖注入接收一个'IHttpContextAccessor',然后从http上下文获得'User'。只需将此参数添加到服务类构造函数:IHttpContextAccessor contextAccessor。将accessor放在字段'_contextAccessor'上,然后在服务方法上从'_contextAccessor.HttpContext.User'中获取。 –
@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。在早期版本中没有尝试过。
你的问题到底是什么? –
你只需要Id?我编辑了我的答案,以添加如何使用更多花哨的_userManager.GetUserId(用户) –
是的,主要是我需要AspNetUsers表中的Id或会话中的Id。 currentUser.FindFirst(ClaimTypes.NameIdentifier).Value使用声明给出Id。它也适用于UserManager!谢谢Gerardo!一种方法比另一种更有效吗? – jbraun