Как создать промежуточное ПО, которое может вызывать базу данных для проверки утверждений пользователей для авторизации пользователя в ядре asp.net 2.2

Как лучше всего создать промежуточное ПО или как правильно реализовать промежуточное ПО в asp.net core 2.2.

Мой сценарий: у меня есть сборка веб-API в asp.net core 2.2, и я реализую авторизацию в своем контроллере примерно так [Authorize(Policy = "UserDelete")] UserDelete - это утверждение пользователя, моя проблема в том, что у меня есть много утверждений пользователя, которые могут быть у пользователя, более или менее до 20 утверждений если я сохраню эти утверждения в JWT, это может вызвать большой размер JWT, все, что я хочу сделать, это вызвать заявки или создать промежуточное ПО, которое вызывает базу данных для этих утверждений, так что все, что мне нужно сохранить в JWT, - это учетные данные пользователя.


person Marco Torrecampo    schedule 27.05.2019    source источник
comment
JWT - это не учетные данные пользователя, это аутентифицированный участник. Вот как это работает. Вся концепция отключена от чего-либо вроде базы данных или постоянства - по замыслу. Приложению не нужно знать или заботиться о том, откуда пришел принципал или как он был создан. Он просто работает с ним и его претензиями. Таким образом, претензии неразделимы, так как это определяет принципала. Это буквально ClaimsPrincipal.   -  person Chris Pratt    schedule 28.05.2019


Ответы (1)


Все, что вам нужно, это создать AuthorizationHandler, следуйте инструкциям: 1- создайте класс и назовите его MinimumPermissionHandler или как-нибудь иначе. скопируйте и вставьте в него следующие коды:

public class MinimumPermissionRequirement : IAuthorizationRequirement { }

public class MinimumPermissionHandler : AuthorizationHandler<MinimumPermissionRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MinimumPermissionRequirement requirement)
    {
        if (!(context.Resource is AuthorizationFilterContext filterContext))
        {
            context.Fail();
            return Task.CompletedTask;
        }

        //check if token has subjectId
        var subClaim = context.User?.Claims?.FirstOrDefault(c => c.Type == "sub");
        if (subClaim == null)
        {
            context.Fail();
            return Task.CompletedTask;
        }

        //check if token is expired
        var exp = context.User.Claims.FirstOrDefault(c => c.Type == "exp")?.Value;
        if(exp == null || new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(long.Parse(exp)).ToLocalTime() < DateTime.Now)
        {
            context.Fail();
            return Task.CompletedTask;
        }

        //other checkpoints
        //your db functions to check if user has desired claims

        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}

2- Определите политику и добавьте обработчик к службам, поэтому поместите эти строки в свой класс Startup:

public void ConfigureServices(IServiceCollection services)
{
   //deleted extra lines for brevity 
   services.AddAuthorization(options =>
   {
      options.AddPolicy("AccessControl", policy =>
      {
           policy.RequireAuthenticatedUser();
           policy.AddRequirements(new MinimumPermissionRequirement());
      });
   });
   //injection
   services.AddScoped<IAuthorizationHandler, MinimumPermissionHandler>();
}

3- Наконец, для проверки прав доступа просто поместите этот код над контроллерами

[Authorize(Policy = "AccessControl")]
person Elyas Esna    schedule 27.05.2019