2012-12-24 3 views
6

Aggiornamento Grazie a un commento di @IvanL, si scopre che il problema è specifico di Google. Da allora ho provato altri provider e per quelli tutto funziona come previsto. Google non sembra inviare informazioni sulle richieste. Non sono ancora riuscito a capire perché o cosa ho bisogno in modo diverso per far sì che Google lo invii.IAuthenticationResponse.GetExtension <ClaimsResponse>() sempre restituendo null

Una pugnalata selvaggia al buio dice che potrebbe essere correlato al reame di default a http: //:/come ho visto una risposta di Andrew Arnott che Google cambia l'identificatore rivendicato per lo stesso account basato sul reame passato con la richiesta di autenticazione.

Un altro forse importante bocconcino di informazioni: a differenza di molti degli esempi che si possono trovare in giro per il web per l'utilizzo di dotnetopenauth, non sto usando una casella di testo "semplice" e comporre l'openIdIdentifier me stesso, ma sto usando la openID selector e che sta fornendo il numero openIdIdentifier passato allo ValidateAtOpenIdProvider. (Come per l'articolo Adding OpenID authentication to your ASP.NET MVC 4 application.)

domanda è: perché è IAuthenticationResponse.GetExtension() sempre tornare nulla quando si utilizza Google come provider OpenID, quando altrimenti tutte le pertinenti gotcha in materia di Google (e-mail richiesto come richiesto, AXFetchAsSregTransform, ecc.) sono stati indirizzati?

originale

sto lottando con ottenere DotNetOpenAuth per analizzare la risposta restituita dal provider. Seguite le istruzioni di Adding OpenID authentication to your ASP.NET MVC 4 application fino al punto in cui il login dovrebbe funzionare e un login risulta in un ritorno alla home page con il nome dell'utente (nickname) visualizzato in alto a destra. (Questo dipende da "L'utente dovrebbe a questo punto vedere quanto segue:" poco più della metà dell'articolo).

Sto utilizzando Visual Studio Web Developer 2010 Express con C#. La versione DotNetOpenAuth è 4.0.3.12153 (secondo packages.config, 4.0.3.12163 secondo Windows Explorer).

mio web.config è stato modificato seguendo le istruzioni nel Activating AXFetchAsSregTransform che era la soluzione per DotNetOpenId - Open Id get some data

Purtroppo non è stato sufficiente per farlo funzionare per me.

Il selettore di openid funziona correttamente e consente di selezionare correttamente il provider di openid. La richiesta di autenticazione viene creata come segue:

public IAuthenticationRequest ValidateAtOpenIdProvider(string openIdIdentifier) 
    { 
     IAuthenticationRequest openIdRequest = openId.CreateRequest(Identifier.Parse(openIdIdentifier)); 

     var fields = new ClaimsRequest() 
     { 
      Email = DemandLevel.Require, 
      FullName = DemandLevel.Require, 
      Nickname = DemandLevel.Require 
     }; 
     openIdRequest.AddExtension(fields); 

     return openIdRequest; 
    } 

Tutto questo funziona.Posso fare il login e autorizzare la pagina per ricevere le mie informazioni, che poi si traduce in una chiamata a GetUser:

public OpenIdUser GetUser() 
    { 
     OpenIdUser user = null; 
     IAuthenticationResponse openIdResponse = openId.GetResponse(); 

     if (openIdResponse.IsSuccessful()) 
     { 
      user = ResponseIntoUser(openIdResponse); 
     } 

     return user; 
    } 

openIdResponse.IsSuccessful è implementata come un metodo di estensione (vedi articolo collegato):

return response != null && response.Status == AuthenticationStatus.Authenticated; 

e sempre è successo come si immette il metodo ResponseIntoUser:

private OpenIdUser ResponseIntoUser(IAuthenticationResponse response) 
    { 
     OpenIdUser user = null; 
     var claimResponseUntrusted = response.GetUntrustedExtension<ClaimsResponse>(); 
     var claimResponse = response.GetExtension<ClaimsResponse>(); 

     // For this to work with the newer/est version of DotNetOpenAuth, make sure web.config 
     // file contains required settings. See link for more details. 
     // http://www.dotnetopenauth.net/developers/help/the-axfetchassregtransform-behavior/ 

     if (claimResponse != null) 
     { 
      user = new OpenIdUser(claimResponse, response.ClaimedIdentifier); 
     } 
     else if (claimResponseUntrusted != null) 
     { 
      user = new OpenIdUser(claimResponseUntrusted, response.ClaimedIdentifier); 
     } 
     else 
     { 
      user = new OpenIdUser("[email protected];ikke van ikkenstein;ikke nick;ikkeclaimedid"); 
     } 
     return user; 
    } 

la mia versione di cui sopra solo differisce dal codice articolo collegato b y mia aggiunta del blocco else finale per garantire che ottengo sempre la home page con un nome utente e un link di disconnessione visualizzato (che aiuta quando si tenta di farlo più volte in successione).

Ho provato sia Google che Yahoo. Entrambi eseguono l'autenticazione, entrambi restituiscono un'asserzione di identità registrata dal server WebDev. Tuttavia, GetUntrustedExtenstion e GetExtensionsempre restituisce null. Vado sempre a vedere "ikke nick" dall'ultimo, mai il nome che ho effettivamente usato per autenticare.

Sono in perdita su come continuare a provare e farlo funzionare. Probabilmente è un po 'di supervisione da parte mia (sono uno sviluppatore esperto, ma ho appena iniziato ad intingere le dita dei piedi in C# e lo sviluppo del front-end web), e non riesco a vederlo.

Qualsiasi e tutti i suggerimenti su come procedere/eseguire il debug di questo sono molto benvenuti.

+1

Puoi [attivare la registrazione] (http://tinyurl.com/dnoalogs) e aggiungere i log alla tua domanda? –

+0

Nota anche il commento che ho appena aggiunto al tutorial a cui hai fatto riferimento che richiama che l'uso dell'indirizzo email per il nome utente è gravemente insicuro. È necessario utilizzare ClaimedIdentifier per il nome utente e visualizzare l'indirizzo di posta elettronica agli utenti come un identificatore amichevole solo se lo si desidera. –

+0

@AndrewArnott: Grazie, sì, ho visto le tue osservazioni sull'utilizzo dell'indirizzo e-mail in altre domande e sono d'accordo. Questo tutorial è solo qualcosa per bagnarmi i piedi ... Aggiungerò il logging e il postback (potrebbe essere un po 'di tempo, uscire presto per una passeggiata sulla spiaggia di Natale). –

risposta

0

Stai utilizzando Google come provider OpenId per testare la tua soluzione? Perché Google ha/avuto l'abitudine di includere le rivendicazioni solo la prima volta che si autentica l'applicazione. Quindi magari provare a utilizzare un nuovo account Google e vedere se funziona?

Ci scusiamo per la risposta lenta, facendo una grande migrazione a un cliente questa settimana :-) Contento che questo piccolo commento abbia risolto il problema.

+0

Solo un peccato che la risoluzione è che Google apparentemente non invia un reclamo anche sulla prima autenticazione ... (vedi i miei commenti successivi e aggiornamento alla domanda) Ah bene, pubblicherò un'altra domanda su come ottenere Google per inviare effettivamente le informazioni ... –