ASP.NET Core Identity - получить текущий пользователь

18

Чтобы получить зарегистрированного пользователя в MVC5, нам нужно было только:

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

Теперь, с ASP.NET Core, я думал, что это должно работать, но оно вызывает ошибку.

    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);
    }

Любые идеи?

РЕДАКТИРОВАТЬ: Ответ Джерардо находится на пути, но для получения фактического «ИД» пользователя это работает:

        ClaimsPrincipal currentUser = this.User;
        var currentUserID = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
    
задан jbraun 03.08.2016 в 20:57
источник

2 ответа

40

Предполагая, что ваш код находится внутри контроллера MVC:

public class MyController : Microsoft.AspNetCore.Mvc.Controller

В базовом классе Controller вы можете получить IClaimsPrincipal из свойства User

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;
    
ответ дан Gerardo Grignoli 03.08.2016 в 21:11
источник
0

В 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.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; }
    
ответ дан Bhail 24.11.2017 в 16:03
источник