2016-07-27 4 views
8

Я использую VS2015, C#.Google не работает после публикации

У меня проблема с входом в систему Google. Из моей конфигурации отладки (localhost) все работает нормально. После публикации на сервере окно входа в google просто не открывается. И никакое исключение не выбрасывается. Вот мой код: Конечно, я добавил адрес сервера к происхождению Ури также уполномоченное перенаправление URI на консоли Google для разработчиков

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

. (так же, как я сделал для локального хоста). Я просто не понимаю, что не так, почему окна входа в систему не открывается?

EDIT:

Добавление класса dsAuthorizationBroker (не хватало моего первого поста - жаль на том):

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

Поместите некоторые отладочные записи, чтобы узнать, какая последняя строка была выполнена. Это поможет обнулить основную причину. Я предполагаю, что это не получает должного значения из AppSettings –

+0

Если вы опубликовали его на виртуальной машине, чем пытаетесь увидеть ошибки из Event Viewer – Lakhtey

+0

@JohnPeters - я добавил регистрацию. Я успешно регистрирую одну строку до UserCredential credential = .... redirect uri (из журнала) - это uri, который у меня есть в URI URI на консоли Google. – FrenkyB

ответ

3
public static async Task<UserCredential> AuthorizeAsync 

Этот метод уже объявлен в GoogleWebAuthorizationBroker и, следовательно, если вы намеревайтесь, чтобы ваша реализация этой функции имела приоритет над базовой реализацией, тогда вам нужно использовать новое ключевое слово.

public new static async Task<UserCredential> AuthorizeAsync 

Вот почему я полагаю, вы входе останавливает строку перед

UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync 

На данный момент, он называет базовую реализацию.

Помимо этого, я, как правило, как правило, используют DotNetOpenAuth для взаимодействия с Google и существует множество простых примеров для подражания, как here и here .. но если вы действительно хотите, чтобы свернуть свой собственный, используя Google Apis только тогда это best place to start

+0

благодарю вас за ответ. Я попробую оба, ваш ответ и DotNetOpenAuth. Если я могу спросить вас - возможно, вы знаете, как работает рабочий пример с DotNetOpenAuth с Twitter/Facebook? – FrenkyB

+0

Я могу добавить код в течение следующих нескольких дней, но могу ли я спросить, каков ваш вариант использования? Вам нужно только авторизовать или вы хотите получать электронные письма и т. Д.? Если это так, есть еще несколько обручей, которые можно перепрыгнуть через Twitter. Говоря это, вот [Пример кода/Примеры] (https://github.com/DotNetOpenAuth/DotNetOpenAuth.Samples) для DotNetOpenAuth, чтобы вы начали, что имеет пример twitter. – timkly

+0

Все, что мне нужно - это логин - получите электронную почту пользователей. Если у вас есть больше тестовых примеров для социальных входов, вам тепло приветствуется. – FrenkyB

Смежные вопросы