2016-07-27 8 views
8

Ich benutze VS2015, C#.Google Login funktioniert nicht nach Veröffentlichung

Ich habe ein Problem mit der Google-Anmeldung. Von meiner Debug-Konfiguration (localhost) funktioniert alles einwandfrei. Nach dem Veröffentlichen auf dem Server wird das Google-Anmeldefenster einfach nicht geöffnet. Und keine Ausnahme wird geworfen. Hier ist mein Code:

[AllowAnonymous] 
public async Task LoginWithGoogle() 
{ 
    HttpRequest request = System.Web.HttpContext.Current.Request; 
    string redirectUri = ConfigurationReaderHelper.GetGoogleRedirectUri(); 

    try 
    {    
     ClientSecrets secrets = new ClientSecrets 
     { 
      ClientId = "***", 
      ClientSecret = "***" 
     }; 

     IEnumerable<string> scopes = new[] { PlusService.Scope.UserinfoEmail, PlusService.Scope.UserinfoProfile }; 

     GoogleStorageCredentials storage = new GoogleStorageCredentials(); 

     dsAuthorizationBroker.RedirectUri = redirectUri; 
     UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync(secrets, 
      scopes, "", CancellationToken.None, storage); 
    } 
    catch(Exception ex) 
    { 
     throw ex; 
    }    
} 


//just getting value from applicationSettings - web.config 
      public static string GetGoogleRedirectUri() 
      { 
    #if DEBUG 
       return GetValueFromApplicationSettings("RedirectUriDEBUG"); 
    #elif PRODUKCIJA 
       return GetValueFromApplicationSettings("RedirectUriSERVER");    
    #endif 
      } 

Natürlich I Servers Adresse des Ursprungs uri hinzugefügt und auch an den autorisierten Redirect uri auf der Google-Konsole für Entwickler. (genau wie ich für den localhost). Ich verstehe nur nicht, was falsch ist, warum Login-Fenster nicht geöffnet werden?

EDIT:

Hinzufügen Klasse dsAuthorizationBroker (wurde von meinem ersten Beitrag fehlt - leider auf, dass man):

namespace Notes 
{ 
    public class dsAuthorizationBroker : GoogleWebAuthorizationBroker 
    { 
     public static string RedirectUri; 

     public static async Task<UserCredential> AuthorizeAsync(
      ClientSecrets clientSecrets, 
      IEnumerable<string> scopes, 
      string user, 
      CancellationToken taskCancellationToken, 
      IDataStore dataStore = null) 
     { 
      var initializer = new GoogleAuthorizationCodeFlow.Initializer 
      { 
       ClientSecrets = clientSecrets, 
      }; 
      return await AuthorizeAsyncCore(initializer, scopes, user, 
       taskCancellationToken, dataStore).ConfigureAwait(false); 
     } 

     private static async Task<UserCredential> AuthorizeAsyncCore(
      GoogleAuthorizationCodeFlow.Initializer initializer, 
      IEnumerable<string> scopes, 
      string user, 
      CancellationToken taskCancellationToken, 
      IDataStore dataStore) 
     { 
      initializer.Scopes = scopes; 
      initializer.DataStore = dataStore ?? new FileDataStore(Folder); 
      var flow = new dsAuthorizationCodeFlow(initializer); 
      return await new AuthorizationCodeInstalledApp(flow, 
       new LocalServerCodeReceiver()) 
       .AuthorizeAsync(user, taskCancellationToken).ConfigureAwait(false); 
     } 
    } 


    public class dsAuthorizationCodeFlow : GoogleAuthorizationCodeFlow 
    {   
     public dsAuthorizationCodeFlow(Initializer initializer) 
      : base(initializer) { } 

     public override AuthorizationCodeRequestUrl 
         CreateAuthorizationCodeRequest(string redirectUri) 
     {    
      return base.CreateAuthorizationCodeRequest(dsAuthorizationBroker.RedirectUri);    
     } 
    } 
} 
+1

Legen Sie einige Debug-Anweisungen, um herauszufinden, was letzte Zeile ausgeführt wurde. Das wird helfen, die Ursache zu beseitigen. Ich vermute, es wird nicht richtig Wert von AppSettings –

+0

Wenn Sie es auf virtuellen Computer veröffentlicht haben, als versuchen, die Fehler von Event Viewer zu sehen – Lakhtey

+0

@JohnPeters - Ich habe Protokollierung hinzugefügt. Ich melde erfolgreich eine Zeile vor UserCredential credential = .... Umleitung uri (aus dem Protokoll) ist uri, die ich im Gegenzug URI auf Google-Konsole habe. – FrenkyB

Antwort

3
public static async Task<UserCredential> AuthorizeAsync 

Diese Methode bereits in GoogleWebAuthorizationBroker und daher, wenn Sie erklärt Wenn Ihre Implementierung dieser Funktion Vorrang vor der Basisimplementierung haben soll, müssen Sie das neue Schlüsselwort verwenden.

public new static async Task<UserCredential> AuthorizeAsync 

diesem Grund habe ich Sie davon ausgehen, stoppt, bevor die Linie Anmeldung

UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync 

An dieser Stelle ist es die Basisimplementierung ruft.

Abgesehen davon, neige ich dazu, im Allgemeinen DotNetOpenAuth zu verwenden, um mit Google interagieren und es gibt viele einfache Beispiele zu folgen, wie here und here .. aber wenn Sie wirklich nur Google Apis rollen möchten, dass Ihre eigene verwenden, dann ist dies Am besten place to start

+0

danke für die antwort. Ich werde sowohl Ihre Antwort als auch DotNetOpenAuth ausprobieren. Wenn ich Sie fragen darf - vielleicht wissen Sie für ein funktionierendes Beispiel mit DotNetOpenAuth mit Twitter/Facebook? – FrenkyB

+0

Ich kann in den nächsten Tagen etwas Code hinzufügen, aber kann ich fragen, was Ihr Anwendungsfall ist? Müssen Sie nur autorisieren oder möchten Sie auch E-Mails usw.? Wenn ja, gibt es ein paar mehr Reifen mit Twitter zu springen. Hier ist der [Beispielcode/Beispiele] (https://github.com/DotNetOpenAuth/DotNetOpenAuth.Samples) für DotNetOpenAuth, um Sie zu starten, die ein twitter-Beispiel hat. – timkly

+0

Alles, was ich brauche, ist Login - Benutzer E-Mail erhalten. Wenn Sie weitere Testfälle für Social Logins haben, sind Sie herzlich willkommen. – FrenkyB

Verwandte Themen