Как претензии отображаются в ядре asp.net - PullRequest
0 голосов
/ 14 февраля 2019

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

image 1

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

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

AuthorizedApiController.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; }
  }
}

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете использовать 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");
        .......
    }
}

И пользователейcontroller:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...