ASP.NET WebApi實現Token驗證

記錄筆記,在博客園中有不少實現Token的方法,這是我看過他們學到的,而後找到適合本身的解決方案,本身無聊總結一下學習經驗寫下的數據庫

WebApi後端接口實現Token驗證後端

Token是在客戶端頻繁向服務端請求數據,服務端頻繁的去數據庫查詢用戶名和密碼並進行對比,判斷用戶名和密碼正確與否,並做出相應提示,在這樣的背景下,Token便應運而生。Token是服務端生成的一串字符串,以做客戶端進行請求的一個令牌,當第一次登陸後,服務器生成一個Token便將此Token返回給客戶端,之後客戶端只需帶上這個Token前來請求數據便可,無需再次帶上用戶名和密碼。服務器

 

 

 第一步:安裝NuGet包app

Install-Package Microsoft.AspNet.WebApi.Owin 
Install-Package Microsoft.Owin.Host.SystemWeb 
Install-Package Microsoft.AspNet.Identity.Owin 
Install-Package Microsoft.Owin.Cors 

第二步:在項目下添加Startup 類async

public class Startup
    {

        public void Configuration(IAppBuilder app)
        {
            // 有關如何配置應用程序的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkID=316888
            ConfigAuth(app);

            HttpConfiguration config = new HttpConfiguration();
            WebApiConfig.Register(config);
            app.UseCors(CorsOptions.AllowAll);
            app.UseWebApi(config);
        }
        public void ConfigAuth(IAppBuilder app)
        {
            OAuthAuthorizationServerOptions option = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"), //獲取 access_token 受權服務請求地址
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), //access_token 過時時間
                Provider = new SimpleAuthorizationServerProvider(), //access_token 相關受權服務
                RefreshTokenProvider = new SimpleRefreshTokenProvider() //refresh_token 受權服務
            };
            app.UseOAuthAuthorizationServer(option);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
        }
    }

第三步:添加SimpleAuthorizationServerProvider類=》access_token 相關受權服務ide

 public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {
        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            context.Validated();
            return Task.FromResult<object>(null);
        }
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
            //GetData accService = new GetData();
            //string md5Pwd = LogHelper.MD5CryptoPasswd(context.Password);
            //bool flag = accService.GetCRMJurisdictionService(context.UserName);
            //if (!flag)
            //{
            // context.SetError("invalid_grant", "對不起,您當前沒有權限!");
            // return;
            //}

            //受權驗證=》根據本身的業務邏輯進行 業務受權

            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim("sub", context.UserName));
            identity.AddClaim(new Claim("role", "user"));
            context.Validated(identity);
        }
    }

第四步:添加SimpleRefreshTokenProvider類 refresh_token 受權服務學習

public class SimpleRefreshTokenProvider : AuthenticationTokenProvider
    {
        private static ConcurrentDictionary<string, string> _refreshTokens = new ConcurrentDictionary<string, string>();

        /// <summary>
        /// 生成 refresh_token
        /// </summary>
        public override void Create(AuthenticationTokenCreateContext context)
        {
            context.Ticket.Properties.IssuedUtc = DateTime.UtcNow;
            context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(60);

            context.SetToken(Guid.NewGuid().ToString("n"));
            _refreshTokens[context.Token] = context.SerializeTicket();
        }

        /// <summary>
        /// 由 refresh_token 解析成 access_token
        /// </summary>
        public override void Receive(AuthenticationTokenReceiveContext context)
        {
            string value;
            if (_refreshTokens.TryRemove(context.Token, out value))
            {
                context.DeserializeTicket(value);
            }
        }
    }

以上就是配置Token的步驟,使用token驗證也很簡單,只需在相應的Controller或Action加上[Authorize]標記ui

第五步:獲取tokenurl

獲取token, POST請求本地http://localhost:55075/token

請求頭 Content-Type:application/x-www-form-urlencoded

參數BODY格式:

grant_type=password

username=admin 

password=123456

 

第六步:訪問API的時候在http請求頭中加上Authorization:bearer Token就能夠成功請求接口了spa

相關文章
相關標籤/搜索