Zentralisierte .NET WebAPI-Autorisierung

In .NET WebAPI habe ich eine Möglichkeit geschaffen, alle Autorisierungsregeln an einem zentralen Ort zu haben, anstatt auf Controller verteilt zu sein. Ich bin neugierig, warum diese Zentralisierung nicht öfter gemacht wird. Gibt es Auswirkungen / Sicherheitsbedenken?

Mein aktueller Ansatz besteht darin, während App_Start ein Wörterbuch zu erstellen, das alle meine Berechtigungsdaten enthält, und dann mithilfe eines DelegatingHandlers die Einschränkungen anzuwenden (Code unten). Der Wörterbuchschlüssel ist ein Tupel des Controllers und der Aktion, und der Wert gibt die autorisierten Rollen an. Der DelegatingHandler verknüpft sich mit der Routing-Konfiguration der WebAPI, um festzustellen, welcher Controller aufgerufen wird, und verwendet dann das Dictionary, um zu bestimmen, ob die Anforderung zulässig ist.

Wörterbuch:

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);
    }
}

Zusammenfassend sind meine Fragen:

Gibt es Probleme bei der Implementierung der rollenbasierten Autorisierung auf diese Weise?Gibt es gute Pakete, die die Autorisierung für WebAPI zentralisieren? Ich habe FluentSecurity untersucht,aber das scheint WebAPI nicht zu unterstützen.

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage