So sichern Sie ASP.Net-Web-APIs mithilfe von Autorisierungsfiltern

Sicherheit ist ein wichtiges Anliegen in webbasierten Unternehmensanwendungen. Wenn Sie Daten über das Kabel übertragen müssen, sollten Sie die verschiedenen Tools kennen, mit denen Sie diese Daten sichern können.

Die ASP.Net-Web-API ist ein kompaktes Framework zum Erstellen zustandsloser RESTful-Dienste, die unter HTTP ausgeführt werden. Eine Möglichkeit zum Sichern von Web-API-Diensten sind Autorisierungsfilter.

Idealerweise sollten Sie die Authentifizierung und Autorisierung frühzeitig in der Web-API-Pipeline durchführen. Dies hilft, unnötigen Verarbeitungsaufwand aus dem Anforderungszyklus zu vermeiden. Beachten Sie, dass Sie unabhängig davon, ob Sie HTTP-Module oder HTTP-Nachrichtenhandler zur Authentifizierung verwenden, den aktuellen Principal (dh den Benutzer) aus der ApiController.UserEigenschaft abrufen können .

Beachten Sie auch, dass Web-API-Autorisierungsfilter vor den Controller-Aktionsmethoden ausgeführt werden. Wenn die eingehende Anforderung nicht autorisiert ist, wird ein Fehler vom Dienst zurückgegeben, die Anforderung wird ignoriert und die Aktionsmethode des Dienstes wird nicht ausgeführt.

Verwenden des AuthorizeAttribute-Autorisierungsfilters

Der integrierte Autorisierungsfilter AuthorizeAttributekann verwendet werden, um eingehende Anforderungen zu autorisieren. Mit können Sie  AuthorizeAttribute überprüfen, ob der Benutzer authentifiziert ist. Wenn der Benutzer nicht authentifiziert ist, gibt er den HTTP-Statuscode 401 zurück. Diese Berechtigung kann in der Web-API global oder auf Controller-Ebene angewendet werden.

Beachten Sie, dass Sie auch einen benutzerdefinierten Nachrichtenhandler implementieren können, um den Zugriff auf Ihre Controller-Methoden zu autorisieren, da Nachrichtenfilter viel früher im Web-API-Lebenszyklus ausgeführt werden.

Um den Zugriff auf alle Controller einzuschränken, können Sie die AuthorizeAttributeglobal zur FiltersSammlung der HttpConfigurationInstanz hinzufügen . Das folgende Codeausschnitt zeigt, wie Sie das AuthorizeAttributezur FiltersSammlung des HttpConfigurationObjekts hinzufügen können .

public static void Register(HttpConfiguration config)

        {

            // Web API configuration and services 

            // Web API routes

            config.MapHttpAttributeRoutes(); 

            config.Routes.MapHttpRoute(

                name: “DefaultApi”,

                routeTemplate: “api/{controller}/{id}”,

                defaults: new { id = RouteParameter.Optional }

            ); 

            config.Filters.Add(new AuthorizeAttribute());

        } 

Verwenden des Attributs "Autorisieren" 

Auf Controller-Ebene können Sie den Zugriff einschränken, indem Sie das AuthorizeAttribut anwenden , wie im folgenden Code-Snippet gezeigt.

[Authorize]

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Sie können das AuthorizeAttribut auch auf Aktionsebene anwenden , um den Zugriff auf eine bestimmte Aktionsmethode zu beschränken. Das folgende Codefragment zeigt, wie dies implementiert werden kann.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

   // Require authorization for a specific action.

    [Authorize]

    public HttpResponseMessage Post(Employee emp) { //Some code }

In dem zuvor gezeigten Codefragment ist der Zugriff auf die Post()Methode eingeschränkt, während der Zugriff auf die Get()Methode nicht eingeschränkt ist. Sie können den Controller auch einschränken und dann anonymen Zugriff auf eine oder mehrere Aktionsmethoden gewähren. Das folgende Code-Snippet veranschaulicht dies.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

    [AllowAnonymous]

    public HttpResponseMessage Post(Employee emp) { //Some code }

}

Autorisieren Sie Aktionen nach Rollen und Benutzern

Es ist auch möglich, den Zugriff auf Aktionsmethoden durch Rollen und Benutzer einzuschränken. Das folgende Codefragment zeigt, wie dies erreicht werden kann.

[Authorize(Users="Joydip,Jini")] //Restrict access by user

public class EmployeesController : ApiController

{

   //Write methods here that correspond to the Http verbs

}

Im obigen Beispiel beschränkt der Employees-Controller den Zugriff nur auf die Benutzer Joydip und Jini. Der folgende Code zeigt, wie Sie den Zugriff nach Rollen einschränken können.

[Authorize(Roles="Administrators")] //Restrict by roles

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Sie können jederzeit auf die ApiController.UserEigenschaft innerhalb der Controller-Methode zugreifen , um das aktuelle Prinzip abzurufen und die Berechtigung basierend auf der Benutzerrolle zu erteilen. Dies wird in der folgenden Codeliste gezeigt.

public HttpResponseMessage Get()

{

    if (User.IsInRole(“Administrators”))

    {

        //Write your code here

    }

}

Verwenden von benutzerdefinierten Autorisierungsfiltern in der ASP.Net-Web-API

Ein Autorisierungsfilter ist eine Klasse, die die AuthorizationFilterAttributeKlasse erweitert und die OnAuthorization()Methode überschreibt . Dies ist die Methode, mit der Sie die Autorisierungslogik schreiben können. Wenn die Autorisierung fehlschlägt, können Sie eine Instanz der UnauthorizedExceptionKlasse oder sogar eine benutzerdefinierte Instanz zurückgeben HttpResponseMessage.

Die folgende Codeliste zeigt, wie Sie eine benutzerdefinierte Klasse zum Autorisieren von Anforderungen an Ihre Web-API implementieren können. Beachten Sie, dass Sie die AuthorizeAttributeKlasse erweitern sollten, um Ihre eigene Berechtigungsfilterklasse zu implementieren.

public class CustomAuthorizeAttribute : AuthorizeAttribute

    {

         public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

            if (AuthorizeRequest(actionContext))

            {

                return;

            }

            HandleUnauthorizedRequest(actionContext);

        }

        protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

           //Code to handle unauthorized request

        }

        private bool AuthorizeRequest(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

            //Write your code here to perform authorization

            return true;

        }

    }