Authentifizieren eines RESTful-Webdiensts

HTTP unterstützt die Verwendung mehrerer Authentifizierungsmechanismen zum Steuern des Zugriffs auf Ressourcen. Die Standardauthentifizierung bietet nur Clients zugriff auf Ressourcen, die über die richtigen Anmeldeinformationen verfügen. In diesem Artikel wird veranschaulicht, wie Sie mithilfe der Standardauthentifizierung den Zugriff auf RESTful-Webdienstressourcen schützen.

Hinweis

In iOS 9 und höher erzwingt App Transport Security (ATS) sichere Verbindungen zwischen Internetressourcen (z. B. dem Back-End-Server der App) und der App, wodurch die versehentliche Offenlegung vertraulicher Informationen verhindert wird. Da ATS in Apps, die für iOS 9 erstellt wurden, standardmäßig aktiviert ist, unterliegen alle Verbindungen den ATS-Sicherheitsanforderungen. Wenn Verbindungen diese Anforderungen nicht erfüllen, schlagen sie mit einer Ausnahme fehl. ATS kann abgemeldet werden, wenn es nicht möglich ist, das Protokoll und die HTTPS sichere Kommunikation für Internetressourcen zu verwenden. Dies kann durch Aktualisieren der Datei Info.plist der App erreicht werden. Weitere Informationen finden Sie unter App Transport Security.

Authentifizieren von Benutzern über HTTP

Die Standardauthentifizierung ist der einfachste Authentifizierungsmechanismus, der von HTTP unterstützt wird, und beinhaltet, dass der Client den Benutzernamen und das Kennwort als unverschlüsselten Base64-codierten Text sendet. Dies funktioniert wie folgt:

  • Wenn ein Webdienst eine Anforderung für eine geschützte Ressource empfängt, lehnt er die Anforderung mit einem HTTP-status Code 401 (Zugriff verweigert) ab und legt den WWW-Authenticate-Antwortheader fest, wie im folgenden Diagramm gezeigt:

Fehler bei der Standardauthentifizierung

  • Wenn ein Webdienst eine Anforderung für eine geschützte Ressource empfängt und der Authorization Header ordnungsgemäß festgelegt ist, antwortet der Webdienst mit einem HTTP-status Code 200, der angibt, dass die Anforderung erfolgreich war und dass sich die angeforderten Informationen in der Antwort befinden. Dieses Szenario wird im folgenden Diagramm dargestellt:

Erfolgreiche Standardauthentifizierung

Hinweis

Die Standardauthentifizierung sollte nur über eine HTTPS-Verbindung verwendet werden. Bei Verwendung über eine HTTP-Verbindung kann der Authorization Header problemlos decodiert werden, wenn der HTTP-Datenverkehr von einem Angreifer erfasst wird.

Angeben der Standardauthentifizierung in einer Webanforderung

Die Verwendung der Standardauthentifizierung wird wie folgt angegeben:

  1. Die Zeichenfolge "Basic " wird dem Authorization Header der Anforderung hinzugefügt.
  2. Benutzername und Kennwort werden in einer Zeichenfolge mit dem Format "username:password" kombiniert, das dann base64-codiert und dem Authorization Header der Anforderung hinzugefügt wird.

Daher wird der Header mit dem Benutzernamen "XamarinUser" und dem Kennwort "XamarinPassword" wie folgt:

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

Die HttpClient -Klasse kann den Authorization Headerwert für die HttpClient.DefaultRequestHeaders.Authorization -Eigenschaft festlegen. Da die HttpClient instance über mehrere Anforderungen hinweg vorhanden ist, muss der Authorization Header nur einmal festgelegt werden und nicht bei jeder Anforderung, wie im folgenden Codebeispiel gezeigt:

public class RestService : IRestService
{
  HttpClient _client;
  ...

  public RestService ()
  {
    var authData = string.Format ("{0}:{1}", Constants.Username, Constants.Password);
    var authHeaderValue = Convert.ToBase64String (Encoding.UTF8.GetBytes (authData));

    _client = new HttpClient ();
    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Basic", authHeaderValue);
  }
  ...
}

Wenn dann eine Anforderung an einen Webdienstvorgang gestellt wird, wird die Anforderung mit dem Authorization Header signiert, was angibt, ob der Benutzer über die Berechtigung zum Aufrufen des Vorgangs verfügt.

Wichtig

Während dieser Code Anmeldeinformationen als Konstanten speichert, sollten sie nicht in einem unsicheren Format in einer veröffentlichten Anwendung gespeichert werden.

Verarbeiten der Serverseite des Autorisierungsheaders

Der REST-Dienst sollte jede Aktion mit dem [BasicAuthentication] -Attribut schmücken. Dieses Attribut wird verwendet, um den Authorization Header zu analysieren und zu bestimmen, ob die base64-codierten Anmeldeinformationen gültig sind, indem sie mit werten verglichen werden, die inWeb.configgespeichert sind. Dieser Ansatz eignet sich zwar für einen Beispieldienst, erfordert jedoch eine Erweiterung für einen öffentlich zugänglichen Webdienst.

Im von IIS verwendeten Standardauthentifizierungsmodul werden Benutzer mit ihren Windows-Anmeldeinformationen authentifiziert. Daher müssen Benutzer über Konten in der Domäne des Servers verfügen. Das Standardauthentifizierungsmodell kann jedoch so konfiguriert werden, dass es die benutzerdefinierte Authentifizierung zulässt, bei der Benutzerkonten für eine externe Quelle wie z. B. eine Datenbank authentifiziert werden. Weitere Informationen finden Sie unter Standardauthentifizierung in ASP.NET-Web-API auf der ASP.NET-Website.

Hinweis

Die Standardauthentifizierung wurde nicht für die Verwaltung des Abmeldens konzipiert. Daher besteht der standardbasierte Authentifizierungsansatz für das Abmelden darin, die Sitzung zu beenden.