Как создать промежуточное программное обеспечение, которое может вызывать базу данных для проверки заявок пользователей на авторизацию пользователя в ядре asp.net 2.2 - PullRequest
0 голосов
/ 27 мая 2019

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

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

1 Ответ

1 голос
/ 27 мая 2019

Все, что вам нужно, это создать 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- Определите политику и добавьте обработчик для служб, поэтому поместите эти строки в свой класс запуска:

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")]
...