.Net WebApi 實現OAuth2.0認證


現在多數公眾平台提供的api都使用OAuth2.0認證模式,最近在搞Android方面的開發,身份認證和權限控制的各方面比較來說,使用OAuth認證的還是比較靠譜,OAuth2.0的協議可以參考https://tools.ietf.org/html/rfc6749。

微信Katana項目實現了OWIN的一系列接口,其中實現OAuth認證主要用到這三個類庫Microsoft.Owin,Microsoft.Owin.Security,Microsoft.Owin.Security.OAuth,其中官方實現了Bearer Token的認證方式,這個是twitter使用的認證模式,可以參考 RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage

基於Owin搭建中間件的方式,Bearer Token的實現包括三個類,OAuthBearerAuthenticationHandler、OAuthBearerAuthenticationMiddleware、OAuthBearerAuthenticationOptions,有興趣的朋友可以自己擴展實現其他的認證方式,如微信api那種類型的,把token放在查詢參數中或者Post的表單里的。

配置身份認證的詳細信息,可以參考官方文檔 http://go.microsoft.com/fwlink/?LinkId=301864

(1) 配置應用程序

在Startup.cs,配置使用BearerToken認證模式,TokenEndpointPath是獲取Token的路徑,Provider配置IOAuthAuthorizationServerProvider接口的實現類處理權限認證過程的各種事件(包括token請求、認證請求、驗證認證等)。

public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/Token"),
                Provider = new ApplicationOAuthProvider(PublicClientId),
                AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                //在生產模式下設 AllowInsecureHttp = false
                AllowInsecureHttp = true                
            };

            // 使應用程序可以使用不記名令牌來驗證用戶身份
            app.UseOAuthBearerTokens(OAuthOptions);

(2)配置Provide,建一個類繼承 OAuthAuthorizationServerProvider,這個類已經實現了大部分功能,我們現在需要做的是用戶認證部分,通過重載GrantResourceOwnerCredentials獲取用戶名和密碼進行認證。

    public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
    {
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

            ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

            if (user == null)
            {
                context.SetError("invalid_grant", "用戶名或密碼不正確。");
                return;
            }

            ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
               OAuthDefaults.AuthenticationType);
            ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
                CookieAuthenticationDefaults.AuthenticationType);

            AuthenticationProperties properties = CreateProperties(user.UserName);
            AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
            context.Validated(ticket);
            context.Request.Context.Authentication.SignIn(cookiesIdentity);
        }
    }

 這樣整個OAuth2.0的認證架構就搭起來了,后面再介紹怎么使用網頁和Android獲取token及訪問數據。

 

夢秋 2016-07-19


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM