2012-12-24 3 views
6

Update Dank eines Kommentars von @IvanL stellt sich heraus, dass das Problem Google spezifisch ist. Ich habe seither andere Anbieter ausprobiert und für diese funktioniert alles wie erwartet. Google scheint keine Anspruchsinformationen zu senden. Ich bin noch nicht in der Lage, herauszufinden, warum oder was ich anders brauche, um Google dazu zu bringen, es zu senden.IAuthenticationResponse.GetExtension <ClaimsResponse>() gibt immer null zurück

Ein wilder Stich im Dunkeln besagt, dass es mit dem auf http: //:/voreingestellten Bereich in Beziehung stehen könnte, da ich eine Antwort von Andrew Arnott gesehen habe, dass Google den beanspruchten Bezeichner für dasselbe Konto basierend auf dem Bereich ändert mit der Authentifizierungsanforderung übergeben.

Ein weiterer möglicherweise wichtiger Leckerbissen von Informationen: im Gegensatz zu vielen der Beispiele, die im Web für die Verwendung von dotnetopenauth gefunden werden kann, verwende ich keine "einfache" Textbox und komponieren die OpenIdIdentifier selbst, aber ich verwende die openID selector und das liefert die openIdIdentifier an die ValidateAtOpenIdProvider übergeben. (Stand der Adding OpenID authentication to your ASP.NET MVC 4 application Artikel.)

Frage ist: Warum ist IAuthenticationResponse.GetExtension() immer null zurückkehrt, wenn die Verwendung von Google als OpenID-Provider, wenn sonst alle relevanten Gotcha ist in Bezug auf Google (E-Mail angefordert je nach Bedarf, AXFetchAsSregTransform, usw.) wurden angesprochen?

Original-

Ich kämpfe mit DotNetOpenAuth immer die Antwort zu analysieren vom Anbieter zurückgegeben. Befolgte die Anweisungen von Adding OpenID authentication to your ASP.NET MVC 4 application bis zu dem Punkt, wo die Anmeldung funktionieren sollte und ein Login-Ergebnis in einer Rückkehr zur Homepage mit dem Namen des Benutzers (Spitzname) oben rechts angezeigt. (Das ist bis zu "Der Benutzer sollte an dieser Stelle folgendes sehen:" etwas über die Hälfte des Artikels).

Ich verwende Visual Studio Web Developer 2010 Express mit C#. DotNetOpenAuth-Version ist 4.0.3.12153 (entsprechend der packages.config, 4.0.3.12163 nach Windows Explorer).

Meine web.config wurde in Activating AXFetchAsSregTransform nach den Anweisungen modifiziert, die die Lösung für DotNetOpenId - Open Id get some data war

Leider war es nicht genug, um es für mich arbeiten zu bekommen.

Der Openid-Selektor funktioniert einwandfrei und führt zu einer korrekten Auswahl des Openid-Providers. Die Authentifizierungsanforderung wird wie folgt erstellt:

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

Das funktioniert alles.Ich kann die Seite anmelden und genehmigen meinen Informationen zu erhalten, die dann in einem Anruf führt zu GetUser:

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

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

     return user; 
    } 

openIdResponse.IsSuccessful wird als Erweiterung Methode implementiert (verlinkte Artikel sehen):

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

und immer erfolgreich ist wie die ResponseIntoUser Methode eingegeben wird:

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

im verlinkten Artikel b Meine Version oben nur aus dem Code unterscheidet y das Hinzufügen des letzten Else-Blocks, um sicherzustellen, dass ich immer die Startseite mit einem Benutzernamen und einem Abmelde-Link angezeigt bekomme (was hilfreich ist, wenn ich versuche, dies mehrmals hintereinander zu tun).

Ich habe sowohl Google als auch Yahoo versucht. Beide authentifizieren ordnungsgemäß, beide geben eine Identitätszusicherung zurück, die vom WebDev-Server protokolliert wurde. Jedoch GetUntrustedExtenstion und GetExtensionimmer zurück null. Ich sehe immer "ikke nick" von der letzten Sekunde, niemals den Namen, den ich tatsächlich benutzt habe, um mich zu authentifizieren.

Ich bin ratlos, wie man weiter versucht und dies zum Funktionieren bringt. Es ist wahrscheinlich ein Versehen meinerseits (ich bin ein erfahrener Entwickler, aber fing gerade an, meine Zehen in C# und Web-Front-End-Entwicklung einzutauchen), und ich kann es nicht sehen.

Alle Vorschläge, wie Sie vorgehen/debuggen sind sehr willkommen.

+1

Können Sie [Protokollierung aktivieren] (http://tinyurl.com/dnoalogs) und Protokolle zu Ihrer Frage hinzufügen? –

+0

Beachten Sie auch den Kommentar, den ich gerade zu dem Tutorial, auf das Sie verwiesen haben, hinzugefügt habe, dass die Verwendung der E-Mail-Adresse für den Benutzernamen äußerst unsicher ist. Sie müssen den ClaimedIdentifier für den Benutzernamen verwenden und die E-Mail-Adresse nur Benutzern als freundliche Kennung anzeigen, wenn Sie dies wünschen. –

+0

@AndrewArnott: Danke, ja, ich habe Ihre Bemerkungen über die Verwendung der E-Mail-Adresse in anderen Fragen gesehen und stimme zu. Dieses Tutorial ist nur etwas, um meine Füße nass zu machen ... Ich füge die Holzfällerei hinzu und poste zurück (es kann einige Zeit dauern, für einen Weihnachtsstrandspaziergang bald ausgehen). –

Antwort

0

Verwenden Sie Google als OpenId-Anbieter, um Ihre Lösung zu testen? Weil Google die Angewohnheit hat, die Ansprüche nur bei der ersten Authentifizierung der Anwendung einzubeziehen. Versuchen Sie vielleicht, ein neues Google-Konto zu verwenden, um zu sehen, ob das funktioniert?

Entschuldigung für die langsame Antwort, die diese Woche eine große Migration auf einem Client durchführt :-) Schön, dass dieser kleine Kommentar Ihr Problem gelöst hat.

+0

Schade, dass die Lösung ist, dass Google selbst bei der ersten Authentifizierung anscheinend keinen Anspruch sendet ... (siehe meine nachfolgenden Kommentare und das Update auf die Frage) Ah, ich werde eine andere Frage stellen, wie man Google bekommt um die Informationen zu senden ... –

Verwandte Themen