2014-04-22 8 views
21

Ich versuche die Asp.net Web Api Individual Accounts Authentifizierung und Autorisierung zu verstehen. Ich habe mehrere Tutorials im Internet gesehen, einschließlich this one. Kurz gesagt, wenn ein Benutzeragent einen Benutzernamen und ein Passwort bereitstellt, gibt die API ein Token aus, das der Client bei nachfolgenden Aufrufen an die API verwendet, um sich selbst zu identifizieren. Der Benutzeragent empfängt das Token, indem er eine Anforderung an folgende Adresse sendet: http://example.com/Token. Der Pfad wird wie so in der Startup-Klasse festgelegt werden:In Web Api/Owin-Architektur, wo werden Anforderungen an '/ Token' behandelt?

TokenEndpointPath = new PathString("/Token") 

Mein Problem ist, ich kann keine Controller-Methoden finden, die diesen Pfad entsprechen. Wie funktioniert das?

Antwort

27

Wenn Sie ein neues Projekt mit individueller Authentifizierung in ASP.NET erstellen, wird die Lösung mit einem OAuth-Provider zur Verarbeitung der Authentifizierungsanforderung erstellt.

Wenn Sie Ihre Lösung betrachten, sollten Sie einen Anbieterordner mit der Klasse ApplicationOAuthProvider sehen.

Diese Klasse implementiert die gesamte Logik für die Authentifizierung Ihrer Mitglieder in Ihrer Website. Die Konfiguration wird auf Start festgelegt, damit Sie den URL-Endpunkt über OAuthOption anpassen können.

OAuthOptions = new OAuthAuthorizationServerOptions 
{ 
    TokenEndpointPath = new PathString("/Token"), 
    Provider = new ApplicationOAuthProvider(PublicClientId), 
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
    AllowInsecureHttp = true 
}; 

Die TokenEndPoint Pfad Eigenschaften definiert die URL, die die GrantResourceOwnerCredentials Methode der GrandResourceOwnerCredentials gefeuert wird.

Wenn Sie Fiedler für die Authentifizierung verwenden und nutzen diese Art von Körper

grant_type=password&username=testUserName&password=TestPassword 

Sie in der folgenden Methode übergeben sollte:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

     ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, 
      OAuthDefaults.AuthenticationType); 
     ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, 
      CookieAuthenticationDefaults.AuthenticationType); 

     AuthenticationProperties properties = CreateProperties(user.UserName); 
     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 
     context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookiesIdentity); 
    } 

wo context.UserName und context.Password sind mit dem aufgegebenen Daten in der Anfrage verwendet. Nachdem die Identität bestätigt wurde (hier mit Entity Framework und einem Paar Benutzername, Passwort in einer Datenbank), wird ein Bearer-Token an den Aufrufer gesendet. Dieses Bearer-Token könnte dann verwendet werden, um für die anderen Anrufe authentifiziert zu werden.

Grüße.

+0

Danke für die Antwort. Es räumt auf! – Joe

+0

@ Jeremie, danke für das Aufräumen. Wirklich tolle Erklärung und das war mein genaues Problem. Kann mir bitte jemand sagen, ob die Verwendung dieses Standard-OAH-Bearer-Tokens die beste und sicherste Art ist, Sicherheit in Ihrer API zu implementieren? Ich bin dabei, eine API zu entwickeln, die dem Internet zugänglich gemacht wird und von einer angularjs Mobile App genutzt wird, an der ich gerade arbeite. Irgendwelche anderen Alternativen? Sehr geschätzt. – fransHbrink

+0

@ Jeremie, Ist es möglich, mehrere Endpoint-URLs zu haben, die alle auf dieselbe IAppBuilder-Anwendung verweisen. Wenn nicht, wie können wir mehrere Endpunkte in einer Web-API-Anwendung haben? – Jami