Как вставить сервис в атрибут для поиска ролей в БД - PullRequest
0 голосов
/ 29 мая 2020

Я настраиваю новый способ аутентификации с использованием Azure AD (AAD), но авторизация на основе ролей все еще должна быть получена из устаревшей системы. Аутентификация AAD действует, и это прекрасно работает. Токен также включает в себя утверждение, давайте назовем его userid в качестве аргумента.

Я хочу создать Атрибут am, который может связываться с устаревшей системой, не игнорируя реализации по умолчанию для проверки токена AAD.

Мне удалось создать следующий атрибут, который я могу использовать в своих методах с [LegacyRole("MyRole", "MyOtherRole")], в то же время имея [Authorize] в моем классе, который правильно обрабатывает токен, пока все хорошо:

public class LegacyRoleAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private string[] _roles;
    private ILegacyRoleService _service;
    public LegacyRoleAttribute(params string[] roles) : base()
    {
        _roles = roles;
        _service = new LegacyRoleService(); //This instantiation, I want to get rid off.
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;
        string userID = user.Claims.FirstOrDefault(c => c.Type == "userid").Value;
        if (string.IsNullOrEmpty(userID))
        {
            context.Result = new UnauthorizedResult();
            return;
        }
        if (!_service.HasAnyRole(userID, _roles))
        {
            context.Result = new UnauthorizedResult();
            return;
        }
    }
}

Но я хочу правильно внедрить сервис, а не использовать новый оператор в конструкции. Конечно, я не хочу менять формат атрибута, поэтому ничего похожего на [LegacyRole(serviceInstance,"MyRole", "MyOtherRole")] или около того.

Как это сделать правильно?

1 Ответ

0 голосов
/ 02 июня 2020

Если вы хотите создать экземпляр метода LegacyRoleService (), объявите его класс (в котором метод объявлен) как Stati c.

Например,

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