Как указать место назначения для существующего ClaimsIdentity?

Я использую приведенный ниже код для создания ClaimIdentity в OpenIdConnectServerProvider.AuthorizationProvider. Но идентификатор identity.Name не выделен. Как разрешить OpenIdConnectServer серарлизовать имя? Спасибо.

Предыдущий вопрос здесь Как создать ClaimIdentity в asp.net 5

var user = await userManager.FindByNameAsync(context.UserName);
var factory = context.HttpContext.RequestServices.GetRequiredService<IUserClaimsPrincipalFactory<ApplicationUser>>();
var identity = await factory.CreateAsync(user);                
context.Validated(new ClaimsPrincipal(identity));       

person Tony Woo    schedule 19.11.2015    source источник


Ответы (1)


Чтобы избежать утечки конфиденциальных данных, AspNet.Security.OpenIdConnect.Server отказывается сериализовать утверждения, в которых явно не указано место назначения.

Чтобы сериализовать имя (или любое другое утверждение), вы можете использовать расширение .SetDestinations:

var principal = await factory.CreateAsync(user);

var name = principal.FindFirst(ClaimTypes.Name);
if (name != null) {
    // Use "id_token" to serialize the claim in the identity token or "access_token"
    // to serialize it in the access token. You can also specify both destinations.
    name.SetDestinations(OpenIdConnectConstants.Destinations.AccessToken,
                         OpenIdConnectConstants.Destinations.IdentityToken);
}

context.Validate(principal);

При добавлении претензии вы также можете использовать расширение AddClaim с параметром destinations:

identity.AddClaim(ClaimTypes.Name, "Pinpoint",
     OpenIdConnectConstants.Destinations.AccessToken,
     OpenIdConnectConstants.Destinations.IdentityToken);
person Kévin Chalet    schedule 19.11.2015
comment
Обновлен для использования нового синтаксиса, представленного ASOS beta5. - person Kévin Chalet; 19.05.2016