如果你想切入追逐,问题是:在asp.net mvc 5中使用DotNetOpenAuth与Google的最佳/官方方式是什么?
大约一年前,我使用了OAuth(DotNetOpenAuth oAuth和OpenID),因为它开箱即用于asp.net MVC 4(就像在示例项目中一样).从那时起,我成功地将它用于谷歌,脸谱,雅虎和微软.但是,最近我一直在用户登录谷歌时出现间歇性问题.我已经尝试升级到MVC 5和DotNetOpenAuth 4.3,但我得到了同样的结果.
当我查看谷歌文档时,我发现了这个:
重要提示: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源中看到'product'下有一个OAuth 2.0库,但我不知道如何使用它.另外,我对Auth 2.0有点紧张,因为我读过的内容并不是非常互补,而且似乎更容易在脚下拍摄(可能没有根据,但它似乎是一个反复出现的主题).
对于Google+,我发现这些说明看起来非常简单,但差不多一年前,所以我想知道这是否仍然是最佳方式.我还发现这个git存储库实现了Google oauth2.不过,我想知道这是否仍然具有相关性,因为它是从前一段时间开始的.
所以,问题是 - 在asp.net mvc5中使用DotNetOpenAuth与Google的最佳/官方方式是什么?希望我没有错过任何明显的东西,在这种情况下只需指向某些链接即可.
更新 我发现这个问题和这个相关的问题.我想我会用git google auth2除非我被告知否则.
解析度
我做了以下事情: -
按照接受的答案提供的链接中的步骤操作.这是这个链接.
重要的是在登录后继续使用SSL而不是回退到HTTP,您的登录cookie就像您的用户名和密码一样秘密...在您登录后重定向回HTTP不会使当前请求或将来的请求更快.
在Nuget上获得最新的DotNetOpenAuth.GoogleOAuth2.
我查看了这个msdn博客(由同一作者)关于如何最好地保护网站的建议.基本上,建议添加以下强制所有页面为HTTPS的内容:
filters.Add( new System.Web.Mvc.RequireHttpsAttribute() );
最终这意味着整个网站都是HTTPS.自从进行这些更改后,该网站运行良好.
这就是您使用DotnetOpenAuth与Google/OAuth2的方式.
首先,参考Nuget的DotnetOpenAuth.Ultimate包.
然后创建提供程序类和概要文件模型类
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 ); } } }
以下是使用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",那么您可能在首次创建解决方案时创建了一个"空白"项目,而不是"Internet"项目.当您第一次开始时,选择"互联网应用程序"会更容易(如果计划使用外部登录).不确定您使用的编辑器,但Visual Studio 2012/2013使这个非常容易!
如果您现在推荐使用OpenID,这是一个很好的起点:https: //developers.google.com/accounts/docs/OpenID#settingup
最后,如果您可以通过编辑器(Visual Studio)访问NUGET,您会发现这些任务,例如添加oAuth-1/2或openId已经变得非常简单.
如果以上内容并不适合您的构建,这里有一个最后一个链接会让您朝着正确的方向前进......有了更多细节,我非常乐意帮助您找到最佳解决方案.我可以说的一件事是,oauth2仍然非常相关并且在今天的许多应用程序中使用,并且在今天开始一个新项目时实现这一点并没有错 - 这将是正确的方式(或者至少其中一个)正确的方法去... ...希望这有一些帮助,而不仅仅是沿着你已经失败的道路走下去.
希望一切安好.