Как изменить значения утверждений в токенах обновления и аутентификации носителя

Я хочу изменить значение претензии с помощью токенов обновления. Мой поставщик токенов обновления выглядит так:

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()
  });

Запрос токена обновления завершается без ошибок. Но когда я использую новый токен доступа, значение утверждения остается старым.

Верен ли мой подход? Или как я могу изменить значение утверждения в аутентификации Bearer?


person Khodaie    schedule 22.04.2017    source источник


Ответы (1)


Наконец я нашел решение. Мне нужно расширить AccessTokenProvider OAuthAuthorizationServerOptions вместо RefreshTokenProvider:

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 в Microsoft.Owin.Security.OAuth только AccessTokenProvider может обновлять токен обновления. Для изменения требований необходимо расширить 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);
            }
         ...
person Khodaie    schedule 22.04.2017