2014-04-22 8 views
21

Sto cercando di capire l'autenticazione e l'autorizzazione degli account individuali di Asp.net Web Api. Ho visto diversi tutorial sul web tra cui this one. In breve, quando un agente utente fornisce nome utente e password, l'API emette un token che il client utilizzerà nelle successive chiamate all'API per identificarsi. L'agente utente riceve il token effettuando una richiesta, in genere a: http://example.com/Token. Il percorso sembra essere impostato nella classe di avvio in questo modo:Nell'architettura Web Api/Owin, dove vengono gestite le richieste a '/ token'?

TokenEndpointPath = new PathString("/Token") 

Il mio problema è, non riesco a trovare alcun metodo di controller che corrispondono a quel percorso. Come funziona?

risposta

27

Quando si crea un nuovo progetto con autenticazione individuale in ASP.NET, la soluzione viene creata con un provider OAuth per gestire la richiesta di autenticazione.

Se si guarda la soluzione, si dovrebbe vedere una cartella Provider con una classe ApplicationOAuthProvider.

Questa classe implementa tutta la logica per autenticare i membri nel proprio sito Web. La configurazione è impostata all'avvio per consentire all'utente di personalizzare l'endpoint dell'URL tramite OAuthOption.

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

Le proprietà Path TokenEndPoint definite l'url che sarà licenziato il metodo GrantResourceOwnerCredentials dei GrandResourceOwnerCredentials.

Se si utilizza Fiddler per autenticare e utilizzare questo tipo di corpo

grant_type=password&username=testUserName&password=TestPassword 

si dovrebbe passare nel seguente metodo:

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); 
    } 

dove context.UserName e context.Password vengono impostate con il dati utilizzati nella richiesta. Dopo che l'identità è stata confermata (qui utilizzando Entity Framework e una coppia userName, Password in un database), un token Bearer viene inviato al chiamante. Questo token Bearer può quindi essere utilizzato per l'autenticazione per le altre chiamate.

Saluti.

+0

Grazie per la risposta. Cancella tutto! – Joe

+0

@Jeremie, grazie per averlo chiarito. Davvero un'ottima spiegazione e questo era il mio problema esatto. Qualcuno può dirmi se l'uso di questo token predefinito oauth bearer è il modo migliore e più sicuro per implementare la sicurezza nella tua API? Sono impegnato nello sviluppo di un'API che sarà esposta a Internet e utilizzata da un'app mobile angularjs su cui sto attualmente lavorando. Qualche altra alternativa? Molto apprezzato. – fransHbrink

+0

@Jeremie, è possibile avere più URL endpoint che puntano tutti alla stessa applicazione IAppBuilder. In caso contrario, come possiamo avere più endpoint di toke in un'applicazione di API Web? – Jami

Problemi correlati