Я настраиваю новый способ аутентификации с использованием 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")]
или около того.
Как это сделать правильно?