Проверка подлинности/авторизация Windows

Я работаю на веб-сайте, где мне нужно авторизовать пользователя через сервис. Если я использую атрибут AuthorizeAttribute (User.Идентификаторы будут установлены). Мой план заключается в создании пользовательского промежуточного ПО, которое устанавливает роли/утверждения для пользователя, но контекст.Пользователь не задан в middleware. Пользователь.Идентификаторы также не будут установлены в контроллерах, где я не добавляю AuthorizeAttribute.

Моя цель состоит в том, чтобы написать промежуточное программное обеспечение, которое получает имя пользователя windows и вызывает службу с именем пользователя, чтобы получить роли, к которым пользователь имеет доступ, а затем установить роли или утверждения для пользователя.

public class RoleMiddleware
{
    private readonly RequestDelegate _next;

    public RoleMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (!rolesSet)
        {
            var result = _service.GetRoles(context.User.Identity.Name);
            //set roles
            //set claims
        }

        await _next.Invoke(context);
    }
}

Будет ли промежуточное программное обеспечение правильным местом для этого, и что мне нужно сделать, чтобы получить доступ к имени пользователя таким же образом, как я делаю, когда я использую AuthorizeAttribute в контроллере?

2 ответа

  1. На мой взгляд, это неправильный способ сделать это. ASP.NET Identity предоставляет богатый набор классов, которые можно переопределить и расширить в соответствии с вашими требованиями.

    Если вы хотите внедрить базы ролей в какой-то пользовательской службе, то вы должны переопределить хранилище ролей (и, возможно, RoleManager тоже) и внедрить там свои пользовательские роли.

    Также стоит посмотреть здесь: использование Role Claims в ASP.NET ядро идентичности

  2. Я решил его с помощью требований

    public class CustomFunctionRequirement : IAuthorizationRequirement
    {
        public CustomFunctionRequirement(string function)
        {
            Function = function;
        }
    
        public string Function { get; }
    }
    

    Дрессировщик

    public class CustomFunctionHandler : AuthorizationHandler<CustomFunctionRequirement>
    {
        private readonly Service _service;
    
        public CustomFunctionHandler(Service service)
        {
            _service = service;
        }
    
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomFunctionRequirement requirement)
        {
            var functions = _service.GetFunctions(context.User.Identity.Name);
    
            if (functions.Any(x => x == requirement.Function))
            {
                context.Succeed(requirement);
            }
    
            return Task.CompletedTask;
        }
    }
    

    Настройка в ConfigureServices при запуске

            services.AddMvc(
                config =>
                {
                    var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
                    config.Filters.Add(new AuthorizeFilter(policy));
                });
    
            services.AddAuthorization(
                options =>
                {
                    options.AddPolicy("User", policy => policy.Requirements.Add(new CustomRequirement("User")));
                });
    

    Теперь я могу в своем контроллере указать требование, добавив атрибут authorize [Authorize (Policy = «User»)].