2014-01-29 2 views
11

Если вы хотите прервать погоню, вопрос в том, что является лучшим/официальным способом использования DotNetOpenAuth с Google в asp.net mvc 5?DotNetOpenAuth 4.3 и Google - OpenID 2.0 + OAuth 1.0 устарели

Примерно год назад я использовал OAuth (DotNetOpenAuth oAuth и OpenID) в значительной степени, поскольку он вышел из коробки для asp.net MVC 4 (как в примере проекта). С тех пор я успешно использовал его для google, facebook, yahoo и microsoft. Однако недавно у меня было intermittent problems с подписью пользователей в Google. Я попытался перейти на MVC 5 и DotNetOpenAuth 4.3, но я получил то же самое.

Когда я посмотрел на документы Google я нашел это:

Важно: Google имеет осуждается поддержку OAuth 1.0. Если вы используете , используя OpenID 2.0 + OAuth 1.0, мы рекомендуем перейти на Google+ Войти. Вход в Google+ обеспечивает механизм аутентификации OAuth 2.0 с богатыми социальными функциями и доступом к дополнительным функциям настольных и мобильных функций Google . Он поддерживает всех пользователей Google и прозрачную миграцию . Подробнее см. В разделе Миграция Google .

я мог бы очень хорошо быть ошибочно, по мне казалось, что вне коробки asp.net MVC 4 DotNetOpenAuth использует OpenID 2.0 (я использую minimumRequiredOpenIdVersion = "V20") + OAuth 1.0. В источнике DotNetOpenAuth я вижу, что в разделе «продукт» есть библиотека OAuth 2.0, но я не уверен, как ее использовать. Кроме того, я немного нервничаю в отношении Auth 2.0, поскольку то, что я прочитал, не очень дополняет друг друга, и кажется, что легче стрелять в ногу (может быть необоснованно, но, похоже, это повторяющаяся тема).

Для Google+ я нашел these instructions, которые кажутся довольно простыми, но это почти год назад, поэтому мне интересно, если это все равно лучший способ пойти. Я также нашел this git repository, внедряя Google oauth2. Тем не менее, я хотел бы знать, насколько это актуально, поскольку все это было с того времени.

Итак, вопрос в том, что является лучшим/официальным способом использования DotNetOpenAuth с Google в asp.net mvc5? Надеюсь, я не пропустил ничего очевидного, и в этом случае просто указатель на некоторые ссылки будет в порядке.

Update Я нашел question и это question, которые связаны между собой. Я предполагаю, что я поеду с google auth2 из git, если мне не будет сказано иначе.

Разрешение

я сделал следующее: -

  • следуют шаги в ссылке, предоставленной принятым ответом. Это this link.

Очень важно, чтобы с помощью SSL после входа в систему и не упасть обратно в HTTP, ваш Логин печенье так же секрет, как имя пользователя и пароль ... перенаправляет обратно в HTTP после того как вы вошли в систему не будет делать текущий запрос или будущие запросы намного быстрее.

  • Получили последнюю DotNetOpenAuth.GoogleOAuth2 на NuGet.

  • Я рассмотрел рекомендацию от this msdn blog (тем же автором) о том, как лучше всего обеспечить безопасность сайта. В основном, рекомендация добавить следующее, которое заставит все страницы на HTTPS:

    filters.Add(new System.Web.Mvc.RequireHttpsAttribute());

В конечном счете это означает, что весь сайт HTTPS. После внесения этих изменений сайт работает нормально.

+0

Привет. Можно ли использовать OAuth 2 для Google Authentication из MVC 4? Или я должен сначала обновить свой проект до MVC 5? Выполняли ли вы какие-либо рекомендации по выполнению такого обновления? Благодаря! – Jaime

+0

@Jaime - для этого я обновился до MVC 5, оставаясь на Visual Studio 2012. Я не могу вспомнить точные шаги, но я уверен, что следую инструкциям на этих сайтах: http: //www.asp. net/mvc/overview/releases/how-to-upgrade-a-aspnet-mvc-4-and-web-api-project-to-aspnet-mvc-5-and-web-api-2 http: // stackoverflow .com/вопросы/19102831/how-to-install-asp-net-mvc-5-in-visual-studio-2012 http://blogs.msdn.com/b/webdev/archive/2013/11/18/ объявляя-релиз-оф-Asp-нетто-и-веб-инструменты-2013-1-для-визуального-студии-2012.aspx. – acarlon

+0

Спасибо @acarlon, я на VS2013. Я перенесла приложение, но без успеха. При попытке отладки я получаю ошибку HTTP 500. Я пытаюсь выяснить, что он отсутствует или неправильно настроен. – Jaime

ответ

5

Вот рекомендуемый способ использования аутентификации Google, а также несколько других социальных интеграций:

http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on

Для того, чтобы использовать oauth2 (предполагая, что вы используете MVC)

  1. Включить поставщика Google OpenID Откройте файл App_Start \ Startup.Auth.cs и удалите символы комментария в //app.UseGoogleAuthentication(); для включения проверки подлинности Google.

  2. В разделе Используйте другой сервис для входа в систему, нажмите кнопку Google. Затем пользователь перенаправляется на сайт google, где вы вводите свои учетные данные.

Если у вас нет этого файла или папки «app_start», то вы, вероятно, создали «пустой» проект, вместо проекта «Интернет», когда вы впервые создали решение. Гораздо проще (если вы планируете использовать внешние логины), чтобы выбрать «интернет-приложение» при первом запуске. Не уверен, какой редактор вы используете, но Visual Studio 2012/2013 делают это смехотворно простым!

Если собираетесь использовать OpenID, который теперь рекомендуемым способом, здесь является отличной отправной точкой: https://developers.google.com/accounts/docs/OpenID#settingup

Наконец, если у вас есть доступ к NuGet через редактор типа (Visual Studio), вы найдете эти задачи, такие как добавление oAuth-1/2 или openId, были сделаны очень просто.

Вот последняя ссылка, которая выведет вас в правильном направлении, если выше не подходит для вашей сборки ... С еще несколькими подробностями я был бы более чем счастлив помочь вам найти лучшее решение. Одна вещь, которую я могу сказать, это то, что oauth2 по-прежнему очень актуальна и используется во многих приложениях сегодня, и вы не ошибетесь в реализации этого при запуске нового проекта сегодня - это был бы правильный путь (или, по крайней мере, один из правильные пути) ... Надеюсь, что некоторые из них помогут и не просто идут по пути, который вы уже спасли.

Надеюсь, все хорошо.

+0

А, спасибо. Я как-то пропустил эту ссылку. Это должно быть проще, чем я изначально планировал. – acarlon

+0

Без проблем! Эти вещи были настолько более тривиальными. .NET действительно прошел долгий путь даже в последние 2 года или около того, когда такие вещи, как это все хорошо, чтобы выйти из коробки. Таким образом, мы все можем сосредоточиться на «Все решения и бизнес-логику для пользователя ПОСЛЕ того, как они могут пройти через дверь») Рад, что я мог бы помочь! – Battery1

9

Так вы используете DotnetOpenAuth с Google/OAuth2.

Во-первых, укажите пакет DotnetOpenAuth.Ultimate от Nuget.

Затем создать класс поставщика и класс профиля модели

public class GoogleClient : WebServerClient 
{ 
    private static readonly AuthorizationServerDescription GoogleDescription = 
     new AuthorizationServerDescription 
    { 
     TokenEndpoint = new Uri("https://accounts.google.com/o/oauth2/token"), 
     AuthorizationEndpoint = new Uri("https://accounts.google.com/o/oauth2/auth"), 
     ProtocolVersion = ProtocolVersion.V20 
    }; 

    public const string ProfileEndpoint = "https://www.googleapis.com/oauth2/v1/userinfo"; 

    public const string ProfileScope = "https://www.googleapis.com/auth/userinfo.profile"; 
    public const string EmailScope = "https://www.googleapis.com/auth/userinfo.email"; 

    public GoogleClient() 
     : base(GoogleDescription) 
    { 
    } 
} 

public class GoogleProfileAPI 
{ 
    public string email { get; set; } 

    private static DataContractJsonSerializer jsonSerializer = 
     new DataContractJsonSerializer(typeof(GoogleProfileAPI)); 

    public static GoogleProfileAPI Deserialize(Stream jsonStream) 
    { 
     try 
     { 
      if (jsonStream == null) 
      { 
       throw new ArgumentNullException("jsonStream"); 
      } 

      return (GoogleProfileAPI)jsonSerializer.ReadObject(jsonStream); 
     } 
     catch (Exception ex) 
     { 
      return new GoogleProfileAPI(); 
     } 
    } 
} 

Затем на странице входа в систему (контроллер Логин) этот код:

private static readonly GoogleClient googleClient = new GoogleClient 
    { 
     ClientIdentifier = "client_id", 
     ClientCredentialApplicator = ClientCredentialApplicator.PostParameter("client_secret") 
    }; 

     // Page_Load of login page if WebForms 
     // Login action of the Account controller if MVC 

     IAuthorizationState authorization = googleClient.ProcessUserAuthorization(); 
     if (authorization == null) 
     { 
      // Kick off authorization request 
      // Google will redirect back here 
      Uri uri = new Uri("http://your.application.address/login"); 
      googleClient.RequestUserAuthorization(returnTo: uri, 
       scope: new[] { GoogleClient.ProfileScope, GoogleClient.EmailScope }); 
     } 
     else 
     { 
      // authorization. we have the token and 
      // we just go to profile APIs to get email (and possibly other data) 
      var request = 
       WebRequest.Create(
        string.Format("{0}?access_token={1}", 
        GoogleClient.ProfileEndpoint, 
        Uri.EscapeDataString(authorization.AccessToken))); 
      using (var response = request.GetResponse()) 
      { 
       using (var responseStream = response.GetResponseStream()) 
       { 
        var profile = GoogleProfileAPI.Deserialize(responseStream); 
        if (profile != null && 
         !string.IsNullOrEmpty(profile.email)) 
         FormsAuthentication.RedirectFromLoginPage(profile.email, false); 
       } 
      } 
     } 
+0

Спасибо, я буду использовать это для справки. Я думаю, что ссылка, которую снабдила батарея1, из информации, в которой я нуждаюсь, поэтому я пойду с этим в качестве ответа. – acarlon

+0

@acarlon: Нет проблем. Обратите внимание, что ваш вопрос был конкретно о DotnetOpenAuth, и мой ответ адресован именно ему. –

+0

Согласен, поэтому I +1. подход mvc5 выглядит проще в этот момент, я пойду с этим. – acarlon