【发布时间】:2021-05-24 11:37:15
【问题描述】:
我正在尝试使用通过 Open ID Connect 接收到的访问令牌在 https://graph.microsoft.com/oidc/userinfo 处执行 userinfo 端点。
收到的响应是:
400 错误请求
{
"error": {
"code": "UnknownError",
"message": "Token must contain sub claim.",
"innerError": {
"date": "2021-02-22T07:14:37",
"request-id": "650a2928-b0e7-49ae-9e6d-ecb569ee69e6",
"client-request-id": "650a2928-b0e7-49ae-9e6d-ecb569ee69e6"
}
}
}
访问令牌有效并且确实包含子声明。
如果我登录到https://developer.microsoft.com/en-us/graph/graph-explorer,并使用它自动检索的访问令牌,它就可以工作——对于同一个用户。子声明是不同的,但有两个。
似乎来自 OIDC 的令牌没有正确的子声明 - 这怎么可能?
直接从 /authorize 端点 [WORKING] 访问令牌:
OIDC 配置:options.Authority = authority;
options.ClientId = Configuration[ConfigKeys.IdentityProvider.ClientID];
options.ClientSecret = Configuration[ConfigKeys.IdentityProvider.ClientSecret];
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.CallbackPath = Configuration[ConfigKeys.IdentityProvider.CallbackPath];
options.SignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.CorrelationCookie.Expiration
= options.NonceCookie.Expiration
= options.ProtocolValidator.NonceLifetime
= options.RemoteAuthenticationTimeout
= TimeSpan.FromHours(8);
options.Resource = "https://graph.microsoft.com";
options.GetClaimsFromUserInfoEndpoint = false;
options.UseTokenLifetime = true;
options.RequireHttpsMetadata = true;
options.SaveTokens = true;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.Scope.Add("offline_access");
options.Scope.Add("groups");
options.RemoteAuthenticationTimeout = TimeSpan.FromHours(10);
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = authority,
//NameClaimType = "name"
};
【问题讨论】:
-
你解析token来查看了吗?
-
是 - jwt.io
标签: .net-core azure-active-directory microsoft-graph-api openid-connect