Как претензии отображаются в ядре asp.net

Я новичок в ядре asp.net, и в настоящее время я работаю в многопользовательском приложении. Теперь я застрял, потому что понятия не имею, как утверждения отображаются в ядре asp.net.

изображение 1

Я получаю указанную выше ошибку при попытке получить доступ к заявкам от MIdAuthorizedBaseApiController.

изображение 2

Получение претензий от UserController.

Мое сомнение заключается в том, что утверждения в токене jwt сопоставляются с «User.Claims». Я получаю утверждения в "UserController.cs". Но мне нужны эти утверждения в MIdAuthorizedBaseApiController.cs, чтобы установить «UserContext".

Заявки доступны в UserController, но сама UserController наследуется от MIdAuthorizedBaseApiController, но претензии там не заполняются. Когда я пытаюсь получить доступ к ней, возникает исключение. Итак, когда и как сопоставляются заявки в токене jwt. Пожалуйста, обратитесь к двум скриншоты выше, чтобы правильно ответить на мой вопрос.

UserController.cs

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class UsersController : MIdAuthorizedBaseApiController
{
     [HttpGet]
    [ProducesResponseType(200, Type = typeof(BusinessEntities.User))]
    [ProducesResponseType(400)]
    [ProducesResponseType(401)]
    public IActionResult Users()
    {
        // Get Tenant Id
        var claimsList = User.Claims.ToList();
        var tenantId = claimsList[4].Value;
        // Set the Claims
        // _claimsHelper.SetClaims(User.Claims.AsQueryable());

        var users = _userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role);//.Where(n => n.TenantId.ToString() == tenantId);

        // Using "LINQ" to Query only the required properties
        var result = from User in users
                     select new
                     {
                        Id = User.Id,
                        UserName = User.UserName,
                        Email = User.Email,
                        PhoneNumber = User.PhoneNumber,
                        // Roles = String.Join(",", (from roles in User.UserRoles select roles.Role.Name))
                     };

        // Return the result set
        if(result != null) {
            return Ok(result);
        }

        return BadRequest(_localizer["2006"]);
}

MIdAuthorizedBaseApiController.cs

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class MIdAuthorizedBaseApiController : AuthorizedApiController
{
    public MIdAuthorizedBaseApiController(UserContext usercontext):base(usercontext)
    {
        PopulateUserContext(usercontext);
    }

    private void PopulateUserContext(UserContext usercontext)
    {
        // Getting exception here when i try to populate User.Claims 
        //here
         var claim = HttpContext.User.Claims.First(c => c.Type == "UserId");

        //To be replaced with details from token
        //usercontext.UserId = Guid.Parse("3C5CD705-8DA0-4536-856B-9F39A6ABC0FA");
        usercontext.UserId = Guid.Parse("43200003-6972-4849-B80F-81896C3B5505");
        usercontext.Username = Guid.NewGuid().ToString();
        //usercontext.TenantId = Guid.Parse("28C914CE-C321-4033-BB87-E9C527249503");
        usercontext.TenantId = Guid.Parse("21550810-A8E7-438F-BBF5-CB0755087356");
        usercontext.ServerName = DateTime.Now.ToLongTimeString();
    }

АвторизованныйApiController.cs

using Agility.Core;
using Agility.Web.Filters;

namespace Agility.Web
{
  [BusinessExceptionFilter]
  public class AuthorizedApiController : BaseApiController
  {
    public AuthorizedApiController(UserContext userContext);

    public UserContext UserContext { get; set; }
  }
}

person Baskaran S    schedule 14.02.2019    source источник


Ответы (1)


Вы можете использовать HttpContextAccessor для доступа к заявкам.

Измените MIdAuthorizedBaseApiController, чтобы выполнить внедрение зависимостей IHttpContextAccessor на контроллерах:

public class MIdAuthorizedBaseApiController : AuthorizedApiController
{
    public MIdAuthorizedBaseApiController(UserContext usercontext, IHttpContextAccessor httpContextAccessor) : base(usercontext)
    {
        PopulateUserContext(usercontext, httpContextAccessor);
    }

    private void PopulateUserContext(UserContext usercontext, IHttpContextAccessor httpContextAccessor)
    {
        // Getting exception here when i try to populate User.Claims 
        //here
        var claim = httpContextAccessor.HttpContext.User.Claims;

        //To be replaced with details from token
        //usercontext.UserId = Guid.Parse("3C5CD705-8DA0-4536-856B-9F39A6ABC0FA");
        .......
    }
}

И контроллер пользователей:

public class ValuesController : MIdAuthorizedBaseApiController
{
    public ValuesController(UserContext usercontext, IHttpContextAccessor httpContextAccessor) : base(usercontext, httpContextAccessor)
    {
    }
}

Кроме того, вы можете обратиться к приведенной ниже ссылке, которая показывает, как защитить ваш ASP.NET Core с помощью аутентификации JWT Bearer, которая использует промежуточное ПО AddJwtBearer для проверки/декодирования токена JWT:

https://jonhilton.net/security/apis/secure-your-asp.net-core-2.0-api-part-2---jwt-bearer-authentication/

person Nan Yu    schedule 15.02.2019
comment
Теперь получаю претензии, как и ожидалось. - person Baskaran S; 15.02.2019
comment
Это единственный способ получить претензии, а также почему он доступен с IHttpContextAccessor и почему не с HttpContext.User.Claims. - person Baskaran S; 15.02.2019
comment
@BaskaranS конструктор контроллера будет выполнен до того, как ActionContext будет установлен, поэтому у вас не будет доступа к таким свойствам, как Context, User . Вам нужно получить идентификатор пользователя в контексте запроса. Другой способ — получить доступ к заявкам в функции OnActionExecuting. - person Nan Yu; 15.02.2019
comment
@BaskaranS, если ответ поможет вам, отметьте его как ответ (зеленая кнопка с галочкой), что может помочь другим, столкнувшимся с такой же проблемой. - person Nan Yu; 15.02.2019