IdentityServer3使用引用令牌时没有scopeclaims

时间:2017-02-12 08:31:47

标签: identityserver3

在IdentityServer中,我添加了一个新的范围:

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

我已经添加了一个客户:

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

我添加了GetProfileData的实现:

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

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

在我的webapi中,我使用了AccessTokenValidation:

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

我的控制器前缀为:

public class Main extends Application {
Player player ;

@Override
public void start(Stage primaryStage) {

     player =new Player("file:///C:/song.mp4");
    Scene scene =new Scene(player,720,480,Color.BLACK);



    primaryStage.setScene(scene);

    primaryStage.show();
    user();
 }
public void user(){
    Scanner sc =new Scanner(System.in);
    System.out.println("enter 1 to pasue");
    int option =sc.nextInt();
    player.pause1(option);
}


public static void main(String[] args) {
    launch(args);

现在,当accesstoken设置为JWT时,这很好,我可以调用端点。现在,如果我将AccessTokenType更改为引用令牌,它将失败... 如果我在调用profiledata端点期间检查RequestedClaimTypes,它会保留对'myscope&#39;使用JWT时,但使用参考令牌时没有... 我错过了一些配置,还是这就是它的工作方式?我原本希望在两个设置

中得到相同的声明

1 个答案:

答案 0 :(得分:0)

引用令牌不是像JWT那样的自包含令牌。它们提供了一个ID,可用于从后备存储中获取引用令牌所代表的信息。

如果您使用的是开箱即​​用的IdentityServer3,您应该能够从POST /connect/token端点请求您的引用令牌,并通过对令牌内省端点的请求进行跟进:

POST /connect/accesstokenvalidation
token={tokenReceivedFromPreviousRequest}

这将返回保留在其后备存储中的该引用令牌的信息,包括范围。

请注意,内省端点同时接受参考令牌和JWT。