DotNetOpenAuth 4.3和Google - OpenID 2.0 + OAuth 1.0已弃用

 是的范德萨 发布于 2023-01-30 17:42

如果你想切入追逐,问题是:在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.自从进行这些更改后,该网站运行良好.

2 个回答
  • 这就是您使用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 );
                    }
                }
            }
    

    2023-01-30 17:44 回答
  • 以下是使用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仍然非常相关并且在今天的许多应用程序中使用,并且在今天开始一个新项目时实现这一点并没有错 - 这将是正确的方式(或者至少其中一个)正确的方法去... ...希望这有一些帮助,而不仅仅是沿着你已经失败的道路走下去.

    希望一切安好.

    2023-01-30 17:44 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有