为什么 SerializeTicket() return 令牌具有资源允许客户端的所有范围

Why does SerializeTicket() return token with all scopes that resource allows for client

使用 AspNet 4.6.2 生成访问令牌,使用任何身份验证流程(尝试过代码流程、隐式流程、客户端凭证流程),使用 AuthenticationTokenCreateContext class 来自 Microsoft.Owin.Security.Infrastructure, 我观察到一些奇怪的行为。

我们已经实现了一个 Auth 服务器,其中的资源可以允许客户端请求某些范围,但是,始终会返回一个令牌,其中包含客户端能够从该资源请求的所有范围。

相关代码为:

var accessTicket = new AuthenticationTicket(new ClaimsIdentity(identity), new AuthenticationProperties());

accessTicket.Properties.SetTicketType("access_token");
accessTicket.Properties.IssuedUtc = nowUtc;
accessTicket.Properties.SetNotBeforeUtc(nowUtc);
accessTicket.Properties.ExpiresUtc = nowUtc.Add(Options.AccessTokenLifetime);
accessTicket.Properties.SetClientId(clientId);
accessTicket.Properties.SetResource(resource);
accessTicket.Properties.SetTokenId(Guid.NewGuid().ToString());
accessTicket.Properties.SetScope(scope);

var accessTokenCreateContext = new AuthenticationTokenCreateContext(Context, Options.AccessTokenFormat, accessTicket);

await Options.AccessTokenProvider.CreateAsync(accessTokenCreateContext);

var accessToken = accessTokenCreateContext.Token;

if (string.IsNullOrEmpty(accessToken))
{
    accessToken = accessTokenCreateContext.SerializeTicket();
}

一旦创建,accessTokenCreateContext.Ticket.Properties.GetScope() returns 预期的范围,但是一旦通过 SerializeTicket() 方法创建了 (JWT) accessToken,令牌就具有客户端能够从资源中请求。

为什么此方法使用不在票证中的范围序列化票证?

这只是对我IDE的误解。我没有意识到 VisualStudio 没有进入某些方法,我认为这是理所当然的,因为我看到它进入了其他方法。

给我的教训:需要学会更好地使用我的工具。