public void Create(AuthenticationTokenCreateContext context) { var clientid = context.Ticket.Properties.Dictionary["as:client_id"]; if (string.IsNullOrEmpty(clientid)) return; // Gera um ID unico para o RefreshToken var refreshTokenId = Guid.NewGuid().ToString("n"); // Pega o tempo de expiração (em minuto) do token do contexto do Owin var refreshTokenLifeTime = context.OwinContext.Get<string>("as:clientRefreshTokenLifeTime"); // Identifica o Browser var userAgent = HttpContext.Current.Request.UserAgent; var userBrowser = new HttpBrowserCapabilities {Capabilities = new Hashtable {{string.Empty, userAgent}}}; var factory = new BrowserCapabilitiesFactory(); factory.ConfigureBrowserCapabilities(new NameValueCollection(), userBrowser); var browser = userBrowser.Browser; // Define os dados do RefreshToken var token = new RefreshToken { Id = HashHelper.GetHash(refreshTokenId), ClientId = clientid, Browser = browser, Subject = context.Ticket.Identity.Name, IssuedUtc = DateTime.UtcNow, ExpiresUtc = DateTime.UtcNow.AddMinutes(Convert.ToDouble(refreshTokenLifeTime)) }; // Define o IssuedUtc e o ExpiresUtc do ticket para determinar o quanto tempo o token vai ser válido context.Ticket.Properties.IssuedUtc = token.IssuedUtc; context.Ticket.Properties.ExpiresUtc = token.ExpiresUtc; // Serializa o ticket para ser gravado na base de dados var ticketSerializer = new TicketSerializer(); token.ProtectedTicket = ticketSerializer.Serialize(context.Ticket); // Grava o ticket na base de dados var refreshTokenDomain = new RefreshTokenDomain(); var result = refreshTokenDomain.Create(token); if (result) context.SetToken(refreshTokenId); }
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context) { // define o cabecalho da resposta do contexto do Owin com a permição de origem var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin"); context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] {allowedOrigin}); // pega o Id do token pelo na requisição var hashedTokenId = HashHelper.GetHash(context.Token); // Identifica o Browser var userAgent = HttpContext.Current.Request.UserAgent; var userBrowser = new HttpBrowserCapabilities {Capabilities = new Hashtable {{string.Empty, userAgent}}}; var factory = new BrowserCapabilitiesFactory(); factory.ConfigureBrowserCapabilities(new NameValueCollection(), userBrowser); var browser = userBrowser.Browser; var refreshTokenDomain = new RefreshTokenDomain(); // busca o token na base de dados pelo id var refreshToken = await refreshTokenDomain.ReadAsync(hashedTokenId, browser); // se o token for encontrado if (refreshToken != null) { // pega os dados do ticket para deserializar e gerar um novo ticket com // as informações mapeadas do usuário que utiliza este token var ticketSerializer = new TicketSerializer(); var ticket = ticketSerializer.Deserialize(refreshToken.ProtectedTicket); context.SetTicket(ticket); // remove o token da base de dados pois em nossa lógica, permitimos apenas // um RefreshToken por usuário e aplicação cliente await refreshTokenDomain.DeleteAsync(hashedTokenId, browser); } }