it-swarm.com.de

ASP.net Web API RESTful-Webdienst + Standardauthentifizierung

Ich implementiere einen RESTful-Webdienst mit ASP.Net Web Api. Ich habe beschlossen, die Standardauthentifizierung + SSL für den Authentifizierungsteil zu verwenden. Was ist der beste/richtige Weg, um das umzusetzen?

Mein erster Versuch war, es manuell zu tun, den Authorization-Header zu analysieren, den Benutzer zu dekodieren und anhand meiner Datenbank zu verifizieren. Es funktioniert, aber ich frage mich, ob mir etwas fehlt.

Ich habe einige Lösungen mit Benutzerrollen und Principals gesehen. Ich bin mir zwar nicht sicher, was diese tatsächlich tun, aber ich bin mir fast sicher, dass ich diese nicht benötigen werde, da ich in meiner Datenbank meine eigenen Benutzer und ihre Rollen definiere.

Was ich auch noch nicht vollständig verstanden habe, ist, ob die Benutzer des Dienstes die Anmeldeinformationen bei jeder Anforderung senden müssen oder sie irgendwie zwischengespeichert werden. Sollte mein Dienst etwas tun, damit dies geschieht, oder liegt es ganz bei den Verbrauchern, damit umzugehen?

Und eine letzte Frage zu Kunden, die Anfragen mit Javascript stellen. Gibt es Probleme mit domänenübergreifenden Anfragen, wenn sie versuchen, den Dienst zu nutzen?

34
alfoks

Jamie Kurtze bietet hier eine gute Erklärung für die Verwendung der Basisauthentifizierung . ASP.NET-Web-API REST Sicherheitsgrundlagen

Wenn Ihre Anforderungen zustandslos sein sollen, muss nach meinem Verständnis für jede Anforderung das Feld Authentifizierung festgelegt werden

Jamie Kurtze packt den erforderlichen Code in eine von DelegateHandler abgeleitete Klasse, während Rick Strahl mithilfe eines Filters überprüft, ob der Aufruf gültig ist. Weitere Informationen finden Sie in seinem Blogbeitrag zu diesem Thema unter Ein Autorisierungsfilter für die WebAPI-Basisauthentifizierung .

30
2D1C

Verwenden Sie die Standardauthentifizierung für die erste (Anmelde-) Anforderung, indem Sie den entsprechenden Controllern/Methoden ein Attribut [BasicHttpAuthorize] Hinzufügen. Geben Sie bei Bedarf Benutzer und Rollen mit dem Attribut an. Definieren Sie BasicHttpAuthorizeAttribute als spezialisiertes AuthorizeAttribute wie folgt:

public class BasicHttpAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if (Thread.CurrentPrincipal.Identity.Name.Length == 0) { // If an identity has not already been established by other means:
            AuthenticationHeaderValue auth = actionContext.Request.Headers.Authorization;
            if (string.Compare(auth.Scheme, "Basic", StringComparison.OrdinalIgnoreCase) == 0) {
                string credentials = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(auth.Parameter));
                int separatorIndex = credentials.IndexOf(':');
                if (separatorIndex >= 0) {
                    string userName = credentials.Substring(0, separatorIndex);
                    string password = credentials.Substring(separatorIndex + 1);
                    if (Membership.ValidateUser(userName, password))
                        Thread.CurrentPrincipal = actionContext.ControllerContext.RequestContext.Principal = new GenericPrincipal(new GenericIdentity(userName, "Basic"), System.Web.Security.Roles.Provider.GetRolesForUser(userName));
                }
            }
        }
        return base.IsAuthorized(actionContext);
    }
}

Lassen Sie die erste Antwort einen API-Schlüssel für den Benutzer enthalten. Verwenden Sie den API-Schlüssel für nachfolgende Aufrufe. Auf diese Weise bleibt die Authentifizierung des Clients auch dann gültig, wenn der Benutzer den Benutzernamen oder das Kennwort ändert. Geben Sie dem Benutzer jedoch beim Ändern des Kennworts die Option "Clients trennen", die Sie implementieren, indem Sie den API-Schlüssel auf dem Server löschen.

24
Edward Brey
1
leastprivilege