Параметры возврата в ASP.NET Web API GrantResourceOwnerCredentials

Я пытаюсь передать некоторые параметры из ASP.NET Web API после входа пользователя.

Я основываю свою работу на этом хорошем учебнике: http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

На демонстрационной странице можно увидеть, что он отправляет обратно имя пользователя, например.

Я создаю своего собственного провайдера, который наследует от OAuthAuthorizationServerProvider И это то, что я делаю:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{ 
    ....

    var identity = new ClaimsIdentity(context.Options.AuthenticationType);
    identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
    identity.AddClaim(new Claim("role", user.Role));

    var props = new AuthenticationProperties(new Dictionary<string, string>
    {
        { 
            "userName", user.UserName
        },
        { 
            "role", user.Role
        }
    });

    var ticket = new AuthenticationTicket(identity, props);
    context.Validated(ticket);
}

Вот как я его подключаю:

var OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
var OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
    AllowInsecureHttp = true,
    TokenEndpointPath = new PathString("/token"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
    Provider = new SimpleAuthorizationServerProvider()
};

// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);

Как я понимаю, словарь AuthenticationProperties должен быть возвращен в ответ JSON клиенту. Но по какой-то причине я не возвращаю свои дополнительные параметры. Это то, что я получаю:

{ "access_token": "G4S1PXdNbtAHLFBo......", "token_type": "носителем", "expires_in": 86399}

Я потратил много времени, пытаясь понять это, может ли кто-нибудь увидеть, что мне не хватает?

Ответ 1

Я нашел свою проблему. Кажется, я неправильно понял словарь свойств.

Я добавил этот метод:

public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
    foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
    {
        context.AdditionalResponseParameters.Add(property.Key, property.Value);
    }

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

В основном он берет записи в словаре и добавляет их в ответ. Моя ошибка заключалась в том, чтобы предположить, что это будет сделано автоматически для меня.