DotNetOpenAuth 4.3 и Google - OpenID 2.0 + OAuth 1.0 устарели

Если вы хотите прервать погоню, возникает вопрос: какой лучший/официальный способ использовать DotNetOpenAuth с Google в asp.net mvc 5?

Примерно год назад я использовал OAuth (DotNetOpenAuth oAuth и OpenID) в значительной степени, поскольку он вышел из коробки для asp.net MVC 4 (как в примере проекта). С тех пор я успешно использовал его для google, facebook, yahoo и microsoft. Тем не менее, в последнее время у меня были проблемы с прерывистыми проблемами, когда пользователи вошли в 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+ я нашел эти инструкции, которые кажутся довольно простыми, но это почти год назад, поэтому мне интересно, лучший способ пойти. Я также нашел этот git репозиторий, реализующий Google oauth2. Тем не менее, я хотел бы знать, насколько это актуально, поскольку все это было с того времени.

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

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

Разрешение

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

  • Следуйте инструкциям в ссылке, предоставленной принятым ответом. Это эта ссылка.

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

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

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

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

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

Ответ 1

Вот рекомендуемый способ использования аутентификации 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)

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

  • В разделе Использование другой службы для входа в систему нажмите кнопку 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 по-прежнему очень актуальна и используется во многих приложениях сегодня, и вы не ошибетесь в реализации этого при запуске нового проекта сегодня - это был бы правильный путь (или, по крайней мере, один из правильные пути)... Надеюсь, что некоторые из них помогут и не просто идут по пути, который вы уже спадали.

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

Ответ 2

Так вы используете 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 );
                }
            }
        }