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.User
Eigenschaft 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 AuthorizeAttribute
kann 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 AuthorizeAttribute
global zur Filters
Sammlung der HttpConfiguration
Instanz hinzufügen . Das folgende Codeausschnitt zeigt, wie Sie das AuthorizeAttribute
zur Filters
Sammlung des HttpConfiguration
Objekts 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 Authorize
Attribut 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 Authorize
Attribut 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.User
Eigenschaft 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 AuthorizationFilterAttribute
Klasse 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 UnauthorizedException
Klasse 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 AuthorizeAttribute
Klasse 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;
}
}