2017-04-22 20 views
1

リフレッシュトークンを使用してクレームの値を変更したいとします。マイリフレッシュトークンプロバイダーは、このようなものです: リフレッシュトークンとベアラ認証でクレーム値を変更する方法

public class MyRefreshTokenProvider : AuthenticationTokenProvider 
{ 
    public override void Create(AuthenticationTokenCreateContext context) 
    { 
    ... 
    var claim = context.Ticket.Identity.FindFirst(ClaimTypes.UserData); 
    if (claim != null) 
    { 
     context.Ticket.Identity.RemoveClaim(claim); 
     context.Ticket.Identity.AddClaim(new Claim(ClaimTypes.UserData, "New Value")); 
    } 

    context.SetToken(context.SerializeTicket()); 
    } 

    public override void Receive(AuthenticationTokenReceiveContext context) 
    { 
    context.DeserializeTicket(context.Token); 
    } 
} 

そして、起動クラスで

app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
    { 
    ... 
    RefreshTokenProvider = new MyRefreshTokenProvider() 
    }); 

リフレッシュトークン要求はエラーなしで完了します。しかし、私が新しいアクセストークンを使用するとき、クレームの価値はまだ古いものです。

私のアプローチは正しいですか?または、ベアラ認証でクレーム値を変更するにはどうすればよいですか?

答えて

0

最後に私は解決策を見つけました。

app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
{ 
    ... 
    AccessTokenProvider = new MyAccessTokenProvider(), 
    RefreshTokenProvider = new MyRefreshTokenProvider() 
}); 

public class MyAccessTokenProvider : AuthenticationTokenProvider 
{ 
    public override void Create(AuthenticationTokenCreateContext context) 
    { 
    ... 
    var claim = context.Ticket.Identity.FindFirst(ClaimTypes.UserData); 
    if (claim != null) 
    { 
     context.Ticket.Identity.RemoveClaim(claim); 
     context.Ticket.Identity.AddClaim(new Claim(ClaimTypes.UserData, "New Value")); 
    } 

    context.SetToken(context.SerializeTicket()); 
    } 

    public override void Receive(AuthenticationTokenReceiveContext context) 
    { 
    context.DeserializeTicket(context.Token); 
    } 
} 

public class MyRefreshTokenProvider : AuthenticationTokenProvider 
{ 
    public override void Create(AuthenticationTokenCreateContext context) 
    { 
    context.SetToken(context.SerializeTicket()); 
    } 

    public override void Receive(AuthenticationTokenReceiveContext context) 
    { 
    context.DeserializeTicket(context.Token); 
    } 
} 

OAuthAuthorizationServerHandlerクラスによるAccessTokenProviderのみさわやかトークンを更新することができMicrosoft.Owin.Security.OAuthに:私の代わりにRefreshTokenProviderAccessTokenProviderOAuthAuthorizationServerOptionsを拡張する必要があります。クレームを変更するにはAccessTokenProviderを延長する必要があります。

private async Task InvokeTokenEndpointAsync() 
    { 
     ... 
     var accessTokenContext = new AuthenticationTokenCreateContext(
      Context, 
      Options.AccessTokenFormat, 
      ticket); 

     await Options.AccessTokenProvider.CreateAsync(accessTokenContext); 

     string accessToken = accessTokenContext.Token; 
     if (string.IsNullOrEmpty(accessToken)) 
     { 
      accessToken = accessTokenContext.SerializeTicket(); 
     } 
     DateTimeOffset? accessTokenExpiresUtc = ticket.Properties.ExpiresUtc; 

     var refreshTokenCreateContext = new AuthenticationTokenCreateContext(
      Context, 
      Options.RefreshTokenFormat, 
      accessTokenContext.Ticket); 
     await Options.RefreshTokenProvider.CreateAsync(refreshTokenCreateContext); 
     string refreshToken = refreshTokenCreateContext.Token; 

     var memory = new MemoryStream(); 
     byte[] body; 
     using (var writer = new JsonTextWriter(new StreamWriter(memory))) 
     { 
      writer.WriteStartObject(); 
      writer.WritePropertyName(Constants.Parameters.AccessToken); 
      writer.WriteValue(accessToken); 
      writer.WritePropertyName(Constants.Parameters.TokenType); 
      writer.WriteValue(Constants.TokenTypes.Bearer); 
      if (accessTokenExpiresUtc.HasValue) 
      { 
       TimeSpan? expiresTimeSpan = accessTokenExpiresUtc - currentUtc; 
       var expiresIn = (long)expiresTimeSpan.Value.TotalSeconds; 
       if (expiresIn > 0) 
       { 
        writer.WritePropertyName(Constants.Parameters.ExpiresIn); 
        writer.WriteValue(expiresIn); 
       } 
      } 
      if (!String.IsNullOrEmpty(refreshToken)) 
      { 
       writer.WritePropertyName(Constants.Parameters.RefreshToken); 
       writer.WriteValue(refreshToken); 
      } 
     ... 
関連する問題