記錄筆記,在博客園中有不少實現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