2015-07-15 19 views
12

Sono sicuro che questo è possibile ma non è sicuro come ottenerlo. Ho un'implementazione OWIN OAUTH che attualmente accetta gli utenti Username e Password e li autentica contro un database. Vorrei estendere questo passaggio a una SmartCard Uid per supportare il single sign-on con una SmartCard.owin oauth invia parametri aggiuntivi

Posso passare altri parametri nel login OWIN e, in caso affermativo, come? La premessa di base è che un utente può effettuare il login con una combinazione username/password O una SmartCard uid (se passa un UID SmartCard e che si trova nel database, l'applicazione accederà all'utente)

Attualmente sto passando username, password e grant_type e vorrei aggiungere uid a quell'elenco e ritirarlo nel mio AuthorizationServiceProvider.

posso vedere UserName, Password e ClientId sul OAuthGrantResourceOwnerCredentialsContext, ma non riesco a vedere tutte le altre proprietà che sosterrebbero quello che sto cercando di realizzare.

Questo è quello che ho attualmente in mio fornitore di servizi

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     var user = await this._userService.FindUser(context.UserName, context.Password); 

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

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim(ClaimTypes.Sid, user.Id.ToString())); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "user")); 
     identity.AddClaim(new Claim("sub", context.UserName)); 

     var secretKeyBytes = Encoding.UTF8.GetBytes(user.PasswordHash); 
     var props = 
      new AuthenticationProperties(
       new Dictionary<string, string> 
        { 
         { "dm:appid", user.Id.ToString() }, 
         { "dm:apikey", Convert.ToBase64String(secretKeyBytes) } 
        }); 

     var ticket = new AuthenticationTicket(identity, props); 
     context.Validated(ticket); 
    } 

voglio essere in grado di ottenere Uid dal contesto come pure, ma non riesco a vedere in ogni caso di raggiungimento di questo, ogni aiuto è molto apprezzato.

risposta

29

È necessario implementare ValidateClientAuthentication se non lo si è fatto.

Questo è il luogo in cui è necessario convalidare il cliente. In questo metodo si esegue una sorta di convalida del client e si impostano gli oggetti/variabili che possono essere letti in GrantResourceOwnerCredentials.

Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 

riceve un'OAuthValidateClientAuthenticationContext che contiene il campo aggiuntivo (s) il vostro passaggio durante la pubblicazione sul server di autorizzazione.

enter image description here

Nella foto qui sopra ho aggiunto un parametro aggiuntivo uid in 4a posizione.

Prima di convalidare la tua contesto:

context.Validated(clientId); 

è possibile impostare la variabile/oggetto:

string uid = context.Parameters.Where(f => f.Key == "uid").Select(f => f.Value).SingleOrDefault()[0]; 
context.OwinContext.Set<string>("SmartCard", uid); 

Ora, nella vostra GrantResourceOwnerCredentials si può semplicemente leggere il valore e utilizzarlo:

string uid = context.OwinContext.Get<string>("SmartCard"); 

Se vuoi saperne di più puoi dare un'occhiata a questo github repository dove passare un oggetto:

context.OwinContext.Set<ApplicationClient>("oauth:client", client); 

Se si scarica l'intera soluzione è possibile verificare con un client JavaScript/jQuery.

+0

Perfetto grazie, ho apportato una leggera modifica alla lettura del parametro nel caso in cui non sia passato in primo luogo, a parte questo è esattamente quello che stavo cercando, grazie –

+0

Contento di aver aiutato Neil. – LeftyX

+0

@LeftyX Ciao. sto cercando di scrivere il mio server oauth proprio usando client_credentials. Ma sono bloccato nel mezzo. posso avere un aiuto? https://github.com/koushiksaha89/oauthserver – user3132179

Problemi correlati