2017-02-12 23 views
0

В IdentityServer я добавил новую область, как это:IdentityServer3 Нет scopeclaims при использовании ссылки маркеров

new Scope 
{ 
    Name = "myscope", 
    Description = "myscope", 
    Type=ScopeType.Resource, 
    ShowInDiscoveryDocument= false, 
    Emphasize = false, 
    //AccessTokenType=1, //Reference 
    AccessTokenType=0, //JWT 
    Claims = new List<ScopeClaim> 
    { 
     new ScopeClaim("location"), 
    } 

Я добавил клиент:

new Client 
{ 
    ClientName = "myclient", 
    Enabled = true, 
    ClientId = "myclient", 
    Flow = Flows.Implicit, 
    AllowedScopes = new List<string> {"myscope"}, 
    Claims = new List<Claim> {new Claim("location", "datacenter")} 
} 

Я добавил реализацию GetProfileData:

public override async Task GetProfileDataAsync(ProfileDataRequestContext context) 
{ 
    await base.GetProfileDataAsync(context); 
    if (context.AllClaimsRequested) 
     context.IssuedClaims = context.Subject.Claims; 
    else if (context.RequestedClaimTypes != null) 
       context.IssuedClaims = context.Subject.Claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList(); 
} 

В моей WebAPI, я использую AccessTokenValidation:

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
{ 
    Authority = "http://localhost:5300", 
    AllowedScopes = { "myscope" }, 
    RequireHttpsMetadata = false, 
}); 

services.AddAuthorization(options => 
{ 
    options.AddPolicy("location", policy => policy.RequireClaim("location")); 
}); 

Мой контроллер с префиксом:

[Authorize(ActiveAuthenticationSchemes = "Bearer", Policy = "location")] 
public async Task<IActionResult> Get() 
{ 
    ... 
} 

Теперь, когда маркер доступа устанавливается в JWT, это работает отлично, я могу назвать конечную точку. Теперь, если я изменяю AccessTokenType для ссылочного токена, он терпит неудачу ... Если я проверяю RequestedClaimTypes во время вызова конечной точки profiledata, он содержит претензии для «myscope» при использовании JWT, но не при использовании ссылочного токена ... Я пропустил какую-то конфигурацию или это так, как это предполагается? Я бы ожидал получить те же претензии в обеих настройках

ответ

0

Ссылка Токены не являются самодостаточными жетонами, такими как JWT. Они предоставляют идентификатор, который можно использовать для извлечения информации, которую ссылочный токен представляет из хранилища резервных копий.

Если вы используете IdentityServer3 из коробки, вы должны быть в состоянии запросить ссылочный маркер с POST /connect/token конечной точки и следует, что с просьбой к маркеру самоанализ конечным:

 
POST /connect/accesstokenvalidation 
token={tokenReceivedFromPreviousRequest} 

Это будет вернуть информацию для этого ссылочного токена, хранящегося в его хранилище, включая области действия.

В качестве примечания, эта точка интроспекции принимает как опорные токены, так и JWT.

+0

[Это сообщение Dominick Baier] (https://leastprivilege.com/2015/11/25/reference-tokens-and-introspection/) более подробно освещает ссылки на токены и интроспекцию, если вы заинтересованы –