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 GetExtension
sempre 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.
Puoi [attivare la registrazione] (http://tinyurl.com/dnoalogs) e aggiungere i log alla tua domanda? –
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. –
@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). –