DotNetOpenAuth 4.3 and Google - OpenID 2.0 + OAuth 1.0 deprecated

后端 未结 2 804
一个人的身影
一个人的身影 2020-12-08 23:19

If you want to cut to the chase, the question is: what is the best/official way to use DotNetOpenAuth with Google in asp.net mvc 5?

About a year ago, I used OAuth (D

2条回答
  •  -上瘾入骨i
    2020-12-09 00:21

    This is how you use DotnetOpenAuth with Google/OAuth2.

    First, reference the DotnetOpenAuth.Ultimate package from Nuget.

    Then create a provider class and the profile model class

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

    Then, in your login page (login controller) have this code:

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

提交回复
热议问题