2017-12-22 16 views
1

토큰 액세스 즉시 만료하지만새로 고침 토큰은 내가 JWT 새로 고침 토큰 구현 및 서로 다른 시간은 새로 고침 토큰 만료 설정하고

var refreshTokenId = Guid.NewGuid().ToString("n"); 
DateTime refreshTokenLifeTime = context.OwinContext.Get<DateTime>("as:clientRefreshTokenLifeTime"); 

데이터베이스에 저장하려면 토큰 액세스로 동시에 만료 복용

context.Ticket.Properties.IssuedUtc = DateTime.Now; 
context.Ticket.Properties.ExpiresUtc = refreshTokenLifeTime; 

context.SetToken(refreshTokenId); 
context.SetToken(context.SerializeTicket()); 
DB을 저장

RefreshToken refreshToken = new RefreshToken(); 
refreshToken.Token = refreshTokenId; 
refreshToken.PrivateKey = context.SerializeTicket(); 
refreshToken.ExpiryDate = refreshTokenLifeTime; 

종료

제가 잘못하고있는 것을 도와 줄 수 있습니까?

+2

여기서 제공된 코드에서 다른 만료 시간을 설정 했습니까? 이 코드에서 두 개의 만료 시간이 같은 값으로 설정되어 있습니다. – Evk

+0

새로 고침 토큰입니다 –

+0

액세스 토큰에 대한 논리를 추가하십시오. 시간이 같으면 두 토큰을 모두 볼 필요가 있습니다. – Dan

답변

3

새로 고침 토큰이 만료 시간을 연장하지 않습니다.이를 슬라이딩 만료라고하며 액세스 토큰으로는 할 수 없습니다. 만료 시간이 아닌 새로 고침 토큰을 사용하여 사용자 역할을 업데이트했습니다. 점검 Slidingexpiration 이 Link 나는 아래 토큰 새로 고침 코드는 이제 요청 문맥이 사용자에 대해 이전에 저장된 모든 주장을 포함

public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider 
{ 

    public async Task CreateAsync(AuthenticationTokenCreateContext context) 
    { 
     var clientid = context.Ticket.Properties.Dictionary["as:client_id"]; 

     if (string.IsNullOrEmpty(clientid)) 
     { 
      return; 
     } 

     var refreshTokenId = Guid.NewGuid().ToString("n"); 

     using (AuthRepository _repo = new AuthRepository()) 
     { 
      var refreshTokenLifeTime = context.OwinContext.Get<string>("as:clientRefreshTokenLifeTime"); 

      var token = new RefreshToken() 
      { 
       Id = Helper.GetHash(refreshTokenId), 
       ClientId = clientid, 
       Subject = context.Ticket.Identity.Name, 
       IssuedUtc = DateTime.UtcNow, 
       ExpiresUtc = DateTime.UtcNow.AddMinutes(Convert.ToDouble(refreshTokenLifeTime)) 
      }; 

      context.Ticket.Properties.IssuedUtc = token.IssuedUtc; 
      context.Ticket.Properties.ExpiresUtc = token.ExpiresUtc; 

      token.ProtectedTicket = context.SerializeTicket(); 

      var result = await _repo.AddRefreshToken(token); 

      if (result) 
      { 
       context.SetToken(refreshTokenId); 
      } 

     } 
    } 

    public async Task ReceiveAsync(AuthenticationTokenReceiveContext context) 
    { 

     var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin"); 
     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin }); 

     string hashedTokenId = Helper.GetHash(context.Token); 

     using (AuthRepository _repo = new AuthRepository()) 
     { 
      var refreshToken = await _repo.FindRefreshToken(hashedTokenId); 

      if (refreshToken != null) 
      { 
       //Get protectedTicket from refreshToken class 
       context.DeserializeTicket(refreshToken.ProtectedTicket); 
       var result = await _repo.RemoveRefreshToken(hashedTokenId); 
      } 
     } 
    } 
} 

지속을 사용하고, 당신은 당신을 허용하는 로직을 추가 할 필요가 새 클레임을 발급하거나 기존 클레임을 업데이트하고 이전에 생성 된 새 액세스 토큰에 포함 시키려면 AuthorizationServerProvider 클래스에 아래 코드를 추가해야합니다. 당신이 어떤 새로운 값으로 설정, 수명을하지 읽고

DateTime refreshTokenLifeTime = context.OwinContext.Get<DateTime>("as:clientRefreshTokenLifeTime"); 

public override Task GrantRefreshToken(OAuthGrantRefreshTokenContext context) 
    { 
     var originalClient = context.Ticket.Properties.Dictionary["as:client_id"]; 
     var currentClient = context.ClientId; 

     if (originalClient != currentClient) 
     { 
      context.SetError("invalid_clientId", "Refresh token is issued to a different clientId."); 
      return Task.FromResult<object>(null); 
     } 

     // Change auth ticket for refresh token requests 
     var newIdentity = new ClaimsIdentity(context.Ticket.Identity); 
     newIdentity.AddClaim(new Claim("newClaim", "newValue")); 

     var newTicket = new AuthenticationTicket(newIdentity, context.Ticket.Properties); 
     context.Validated(newTicket); 

     return Task.FromResult<object>(null); 
    } 
+0

내 코드, 동일한 코드가 잘못되었습니다. 새로 고침 토큰 논리 만 붙여 넣었습니다. –

+0

동일한 논리가 구현되어 액세스 토큰 새로 고침 토큰을 생성 할 때마다 생성되므로 더 긴 유효 기간의 새로 고침 토큰을 사용하는 경우 –

+0

하시기 바랍니다. 대답을 다시 확인하십시오, 나는 그것을 더 편리하게 업데이트했습니다. –

1

이것은 잘못된 것입니다.

+0

context.Ticket.Properties.ExpiresUtc = refreshTokenLifeTime; ... 여기에 값을 설정하고 있습니다. –

+0

@ Md.ParvezAlam은 Owin 컨텍스트에서 읽은 것입니다. 어디서나 av tokenvalue를 생성하지 않습니다 (제공 한 코드 샘플에서). –