/// <summary> /// 创建refreshToken /// </summary> /// <param name="context"></param> /// <returns></returns> public override async Task CreateAsync(AuthenticationTokenCreateContext context) { if (string.IsNullOrEmpty(context.Ticket.Identity.Name)) return; var clietId = context.OwinContext.Get<string>("as:client_id"); if (string.IsNullOrEmpty(clietId)) return; var refresh_token_time = context.OwinContext.Get<string>("as:refresh_token_time"); if (string.IsNullOrEmpty(refresh_token_time)) return; string IpAddress = context.Request.RemoteIpAddress + ":" + context.Request.RemotePort; var token = new Token() { ClientId = clietId, UserName = context.Ticket.Identity.Name, IssuedUtc = DateTime.UtcNow, ExpiresUtc = DateTime.UtcNow.AddSeconds(Convert.ToDouble(refresh_token_time)), IpAddress = IpAddress }; context.Ticket.Properties.IssuedUtc = token.IssuedUtc; context.Ticket.Properties.ExpiresUtc = token.ExpiresUtc; token.AccessToken = context.SerializeTicket(); token.RefreshToken = await _clientAuthorizationService.GenerateOAuthClientSecretAsync(); if (await _clientAuthorizationService.SaveTokenAsync(token)) { context.SetToken(token.RefreshToken); } /* // maybe only create a handle the first time, then re-use for same client // copy properties and set the desired lifetime of refresh token var tokenProperties = new AuthenticationProperties(context.Ticket.Properties.Dictionary) { IssuedUtc = context.Ticket.Properties.IssuedUtc, ExpiresUtc = context.Ticket.Properties.ExpiresUtc }; var token = context.SerializeTicket(); var refreshTicket = new AuthenticationTicket(context.Ticket.Identity, tokenProperties); _refreshTokens.TryAdd(token, refreshTicket); // consider storing only the hash of the handle context.SetToken(token); */ }
//<summary> //创建Token //</summary> //<param name="context">上下文</param> //<returns></returns> public override async Task CreateAsync(AuthenticationTokenCreateContext context) { if (string.IsNullOrEmpty(context.Ticket.Identity.Name)) return; string IpAddress = context.Request.RemoteIpAddress + ":" + context.Request.RemotePort; var token = new Token() { ClientId = context.Ticket.Identity.Name, ClientType = "client_credentials", Scope = context.Ticket.Properties.Dictionary["scope"], UserName = context.Ticket.Identity.Name, IssuedUtc = DateTime.Parse(context.Ticket.Properties.IssuedUtc.ToString()), ExpiresUtc = DateTime.Parse(context.Ticket.Properties.IssuedUtc.ToString()), IpAddress = IpAddress }; token.AccessToken = context.SerializeTicket(); token.RefreshToken = string.Empty;//await _clientAuthorizationService.GenerateOAuthClientSecretAsync(); //Token没有过期的情况强行刷新,删除老的Token保存新的Token if (await _clientAuthorizationService.SaveTokenAsync(token)) { context.SetToken(token.AccessToken); } }
/// <summary> /// 保持票据 /// </summary> /// <param name="token">票据</param> /// <returns></returns> public async Task<bool> SaveTokenAsync(Token token) { const string cmdText = @"INSERT INTO Tokens(clientId,userName,accessToken ,refreshToken,issuedUtc ,expiresUtc,IpAddress) VALUES(@clientId,@userName,@accessToken ,@refreshToken,@issuedUtc ,@expiresUtc,@IpAddress)"; try { // return await new SqlConnection(DbSetting.App).InsertAsync(token) != 0; return await new SqlConnection(DbSetting.App).ExecuteAsync(cmdText, new { clientId = token.ClientId, userName = token.UserName, accessToken = token.AccessToken, refreshToken = token.RefreshToken, issuedUtc = token.IssuedUtc, expiresUtc = token.ExpiresUtc, IpAddress = token.IpAddress }) != 0; } catch (Exception ex) { return false; } }
/// <summary> /// 保持票据 /// </summary> /// <param name="token">票据</param> /// <returns></returns> public async Task<bool> SaveTokenAsync(Token token) { return await _clientAuthorizationRepository.SaveTokenAsync(token); }