.NET WebAPI централизованная авторизация
В .NET WebAPI я создал способ, чтобы все правила авторизации располагались в одном месте, а не разбросаны по контроллерам. Мне любопытно, почему эта централизация не проводится чаще; есть ли последствия / проблемы безопасности?
Мой текущий подход заключается в создании словаря во время App_Start, который содержит все мои данные авторизации, а затем с использованием DelegatingHandler для применения ограничений (код ниже). Ключ словаря - это кортеж контроллера и действия, а значение - авторизованные роли. DelegatingHandler связывается с конфигурацией маршрутизации WebAPI, чтобы узнать, какой контроллер вызывается, а затем использует словарь, чтобы определить, разрешен ли запрос.
Словарь:
var authorizations = new Dictionary<Tuple<string, string>, string>();
authorizations.Add(new Tuple<string, string>("values", "get"), "public");
authorizations.Add(new Tuple<string, string>("values", "put"), "private");
DelegatingHandler:
public class SecurityDelegateHandler : DelegatingHandler
{
private readonly Dictionary<Tuple<string, string>, string> _authorizations;
public SecurityDelegateHandler(Dictionary<Tuple<string, string>, string> auth)
{
_authorizations = auth;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var config = GlobalConfiguration.Configuration;
var controllerSelector = new DefaultHttpControllerSelector(config);
var descriptor = controllerSelector.SelectController(request);
string restrictions;
if (!_authorizations.TryGetValue(
new Tuple<string, string>(descriptor.ControllerName.ToLower(),
request.Method.ToString().ToLower()), out restrictions))
{
return Task<HttpResponseMessage>.Factory.StartNew(() =>
request.CreateResponse(HttpStatusCode.Forbidden,
"Access denied on unconfigured actions"),
cancellationToken);
}
if (!(Roles.Provider).GetRolesForUser(
HttpContext.Current.User.Identity.Name).Any(r =>
restrictions.Contains(r)))
{
return Task<HttpResponseMessage>.Factory.StartNew(() =>
request.CreateResponse(HttpStatusCode.Forbidden,
"Access Denied"), cancellationToken);
}
return base.SendAsync(request, cancellationToken);
}
}
Итак, мои вопросы:
Есть ли проблемы с реализацией Role Based Authorization таким образом?Есть ли какие-нибудь хорошие пакеты, которые обрабатывают централизацию авторизации для WebAPI? Я посмотрел в FluentSecurity,но это не поддерживает WebAPI.Спасибо!