webentwicklung-frage-antwort-db.com.de

Plattformübergreifende Authentifizierung mit ASP.NET Web API

Wie kann ich sogar die Authentifizierung mithilfe der ASP.NET-Web-API kodieren, sodass es plattformübergreifend zur Unterstützung von Desktop, Mobile und Web ist? Ich habe einige Methoden zur Durchführung der RESTful-Authentifizierung gelesen, z. B. die Verwendung von Tokens im Header.

Gibt es irgendwelche Beispielprojekte, die diese Methode verwenden? 

Fragen:

  1. Wenn nicht, wie korrigiere ich das [Authorize]-Attribut, um das Token zu lesen? 
  2. Wie generiere ich dieses Token? Ich glaube nicht, dass ich die Formularauthentifizierung verwenden kann, da dies Cookies verwendet.
  3. Wie gehe ich mit der eigentlichen Autorisierung um, sende der Kunde ein Rohkennwort und einen Benutzernamen? Dann generiere ich das Token oder gibt es eine andere Möglichkeit?
  4. Wie gehe ich mit meiner Website um? Ich habe gehört, dass dies anders gehandhabt wird als wenn eine App es verwendet, z. B. die Domäne abrufen und autorisieren.
50
Shawn Mclean

Ich denke, dass Token ein guter Weg sind. Die Formularauthentifizierung basiert auf Cookies für das Web. Nicht die beste Ideensituation für alle Nicht-Browser-Clients. 

Was ich vorschlagen würde, ist das Erstellen eines benutzerdefinierten AuthorizationFilterAttribute und das Überschreiben der OnAuthorization-Methode. Bei dieser Methode können Sie prüfen, ob ein Token vorhanden ist, das Sie an den Client ausgegeben haben, nachdem Sie gültige Anmeldeinformationen angegeben haben. Sie können dieses Attribut für jede Methode oder jeden Controller verwenden, die Sie validieren möchten. Hier ist ein Beispiel, auf das Sie sich beziehen könnten

 public class AuthorizeTokenAttribute : AuthorizationFilterAttribute 
{      
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext != null)
        {                
                if (!AuthorizeRequest(actionContext.ControllerContext.Request))
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request }; 
                }
                return;
        }
    }

    private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request)
    {
        bool authorized = false;
        if (request.Headers.Contains(Constants.TOKEN_HEADER))
        {               
            var tokenValue = request.Headers.GetValues("TOKEN_HEADER");
            if (tokenValue.Count() == 1) {
                var value = tokenValue.FirstOrDefault();               
               //Token validation logic here
               //set authorized variable accordingly
            }                
        }
        return authorized;
    } }

TOKEN_HEADER ist nur eine Zeichenfolge, die einen HTTP-Header darstellt, den der Client für authentifizierte Anforderungen zurückgeben soll.

Lass uns durchgehen

  1. Client fordert sichere Daten an
  2. Der Kunde ist nicht berechtigt, eine Antwort mit einem nicht autorisierten Statuscode zurückzugeben
  3. Der Client sendet Anmeldeinformationen zur Authentifizierung, die über HTTPS gesichert werden sollten
  4. Nach der Validierung erhält der Client ein Token über einen HTTP-Header oder was auch immer für Sie funktioniert
  5. Der Client versucht erneut, sichere Daten anzufordern. Diesmal wurde das Token an die Anforderung angehängt
  6. AuthorizeTokenAttribute überprüft das Token und lässt die Aktion ausführen.

Überprüfen Sie auch diesen Beitrag von John Petersen. Die Sicherheit Ihres ASP.NET-Web-APIs sicherstellen

42
cecilphillip

Es gibt viele Möglichkeiten, Benutzer für einen REST - Dienst zu authentifizieren. Die Verwendung von Token ist möglich, aber die Verwendung von Basic Authentication ist noch einfacher und so standard und plattformübergreifend wie möglich.

Verwechseln Sie nicht authorisation mit authentication . Das Attribut [Authorize] befasst sich ausschließlich mit der Autorisierung, jedoch nur, nachdem ein Benutzer mit einem anderen Mechanismus authentifiziert wurde. Die Autorisierung ist völlig unbrauchbar, ohne vorher eine korrekte Authentifizierung durchzuführen.

Die beste Ressource zum Überprüfen ist Dominick Baier Wer ist ein Experte für das Thema.

21
Maurice

Ich verwende einen sehr einfachen Ansatz: 

  1. definieren eines Zugriffsprofils mit seiner eindeutigen accessId und seinem accessKey (z. B. MD5-Hashwert GUID).
  2. speichern Sie dieses Zugangsprofil in der Datenbank
  3. jede Anforderung (GET/POST/etc.) muss accessId, queryHash (MD5-Hashwert stellt die Abfrage) und Signatur (MD5-Hashwert von queryHash + accessKey) bereitstellen. Natürlich muss der Client den accessKey an einem sicheren Ort aufbewahren !!!
  4. server ruft die Anfrage auf, überprüft die accessId und die Signatur mit demselben Berechnungsalgorithmus, um den Zugriff abzulehnen oder zu gewähren (authentifizieren)
  5. eine weitere Autorisierung kann auf Anfragebasis unter Verwendung des Zugangsprofils erfolgen 

der Dienst mit diesem Ansatz, der die neue ASP.NET MVC-Web-API verwendet, kann jeden Client-Typ bedienen: Browser/Javascript und native (Desktop oder Mobile) usw.

2
user1344426

Sie können ActionFilterAttribute verwenden und die OnActionExecuting-Methode überschreiben ..__ Registrieren Sie diesen Filter später in global.cs, um diesen Filter für alle derartigen Aktionen in Application Start-Methode anzuwenden

var config = GlobalConfiguration.Configuration; config.Filters.Add (new CustomAuthAttribute ());

{ Namespace Customss { Öffentliche Klasse CustomAuthAttribute: ActionFilterAttribute

{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        // To inforce HTTPS if desired , else comment out the code
        if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
            {
                Content = new StringContent("HTTPS Required")
            };
            return;
        }

       // get toekn from the header

        var userToken = actionContext.Request.Headers.GetValues("UserToken");
         // Customer Logic to check the validity of the token.
        // U can have some DB logic to check , custom STS behind or some loca cache used to compare the values


    }


}

} }

0
Mian