在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时,但使用参考令牌时没有... 我错过了一些配置,还是这就是它的工作方式?我原本希望在两个设置
中得到相同的声明答案 0 :(得分:0)
引用令牌不是像JWT那样的自包含令牌。它们提供了一个ID,可用于从后备存储中获取引用令牌所代表的信息。
如果您使用的是开箱即用的IdentityServer3,您应该能够从POST /connect/token
端点请求您的引用令牌,并通过对令牌内省端点的请求进行跟进:
POST /connect/accesstokenvalidation token={tokenReceivedFromPreviousRequest}
这将返回保留在其后备存储中的该引用令牌的信息,包括范围。
请注意,内省端点同时接受参考令牌和JWT。