Как ссылаться на класс из обработчика авторизации - PullRequest
0 голосов
/ 06 октября 2018

У меня есть этот фильтр, и я хочу сослаться на класс, чтобы использовать его метод.Тем не менее, я не могу использовать его в RoleVerificationHandler или даже ссылаться на метод.

Вот как на него ссылаются в Startup.cs.Я не уверен, как сюда добавить ссылку на класс.

services.AddAuthorization(options =>
{
    options.AddPolicy("SystemAdministrator", policy => policy.Requirements.Add(new RolesFilter("SystemAdministrator", ApplicationGlobals.ApplicationName)));
});
services.AddSingleton<IAuthorizationHandler, RoleVerificationHandler>();

RolesFilter class

public class RolesFilter : IAuthorizationRequirement
{
    public String Role { get; set; }
    public String ApplicationName { get; set; }
    private DecodeToken decodeToken { get; set; }

    public RolesFilter(String Role,String ApplicationName, DecodeToken decodeToken)
    {
        this.Role = Role;
        this.ApplicationName = ApplicationName;
        this.decodeToken = decodeToken;
    }
}

public class RoleVerificationHandler : AuthorizationHandler<RolesFilter>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesFilter requirement)
    {
        //get roles based on app id, then check if the user has the correct role
        var roles = context.User.Claims.Where(c => c.Type == "Roles").Select(c => c.Value).ToList();
        foreach(var item in roles)
        {
            var currentItem = JsonConvert.DeserializeObject<UserRoleDetailsViewModel>(item);
            UserRoleDetailsViewModel urdvm = new UserRoleDetailsViewModel
            {
                Id = currentItem.Id,
                Name = currentItem.Name,
                ApplicationId = currentItem.ApplicationId,
                ApplicationName = currentItem.ApplicationName
            };
            if(requirement.Role == urdvm.Name && urdvm.ApplicationName == ApplicationGlobals.ApplicationName)
            {
                context.Succeed(requirement);
            }

        }
        return Task.CompletedTask;
    }
}

1 Ответ

0 голосов
/ 08 октября 2018

Явно внедряет желаемую зависимость в RoleVerificationHandler через внедрение конструктора.

Ссылка Внедрение зависимостей в обработчики требований в ASP.NET Core

Обработчики авторизации должны быть зарегистрированы в коллекции служб во время настройки (с использованием внедрения зависимостей)......

services.AddSingleton<IMyDependency, MyDependency>();
services.AddSingleton<IAuthorizationHandler, RoleVerificationHandler>();

Экземпляр обработчика будет создан при запуске вашего приложения, и DI вставит вашу зарегистрированную зависимость в конструктор вашего обработчика.

public class RoleVerificationHandler : AuthorizationHandler<RolesFilter> {
    private readonly IMyDependency dependency;

    public RoleVerificationHandler(IMyDependency dependency) {
        this.dependency = dependency;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesFilter requirement)
    {
        //get roles based on app id, then check if the user has the correct role
        var roles = context.User.Claims.Where(c => c.Type == "Roles").Select(c => c.Value).ToList();
        foreach(var item in roles) {
            var currentItem = JsonConvert.DeserializeObject<UserRoleDetailsViewModel>(item);
            UserRoleDetailsViewModel urdvm = new UserRoleDetailsViewModel {
                Id = currentItem.Id,
                Name = currentItem.Name,
                ApplicationId = currentItem.ApplicationId,
                ApplicationName = currentItem.ApplicationName
            };
            if(requirement.Role == urdvm.Name && urdvm.ApplicationName == ApplicationGlobals.ApplicationName) {
                context.Succeed(requirement);
            }    
        }
        return Task.CompletedTask;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...