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