OpenIdConnectAuthenticationOptions 和 AcquireTokenByAuthorizationCodeAsync:无效的 JWT 令牌
OpenIdConnectAuthenticationOptions and AcquireTokenByAuthorizationCodeAsync: Invalid JWT token
我正在尝试使用 OWIN OIDC 中间件授权代码,然后希望是刷新令牌。但是,我收到此错误:
Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException: 'AADSTS50027: 无效的 JWT 令牌。 AADSTS50027:无效的 JWT 令牌。令牌格式无效。
跟踪 ID:8622dfea-05cd-4080-a52c-ec95a9593800
关联 ID:1cf57566-1e02-4856-a4bc-357d5b16ae8a
请注意,身份验证部分有效:我确实取回了原始 IdToken,并且触发了 SecurityTokenValidated Notifications 事件。上面的错误发生在 "AcquireTokenByAuthorizationCodeAsync" 行。
我想做的是在 Azure AD(上游)和我的客户端(下游)之间使用 IdentityServer 作为 IdP,我需要捕获刷新令牌以在客户端尝试使用时针对 AAD 进行验证下游刷新令牌,这样我就不会在 AAD 用户被锁定或删除时发出访问令牌。
var authority = "https://login.microsoftonline.com/xxx.onmicrosoft.com/v2.0";
var clientId = "xxx-30f5-47c2-9ddb-b5fcfd583f96";
var redirectUri = "http://localhost:60546/oidcCallback";
var clientSecret = "c8RRB4DCUiXMPEotQh2jm2ArgpYAqUMjGhDRKuuJOxxx";
var oidc = new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
Caption = "OIDC",
ResponseType = OpenIdConnectResponseTypes.CodeIdToken,
RedirectUri = redirectUri,
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters() { ValidateIssuer = false },
SignInAsAuthenticationType = signInAsType,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async e =>
{
var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(authority);
var result = await authContext.AcquireTokenByAuthorizationCodeAsync(e.ProtocolMessage.Code, new Uri(redirectUri), new ClientAssertion(clientId, clientSecret));
logger.Info(result.IdToken);
}
}
};
app.UseOpenIdConnectAuthentication(oidc);
谢谢!
我能看到的一件事是错误的,你应该使用 ClientCredential
,而不是 ClientAssertion
:
var result =
await authContext.AcquireTokenByAuthorizationCodeAsync(
e.ProtocolMessage.Code,
new Uri(redirectUri),
new ClientCredential(clientId, clientSecret));
然后是第二件事。您正在使用 ADAL,但似乎您正在使用 v2 端点。我假设您在 apps.dev.microsoft.com
?
注册了该应用程序
在这种情况下,您应该使用 MSAL (https://www.nuget.org/packages/Microsoft.Identity.Client)。
MSAL 的 API 有点不同,您使用的 class 称为 ConfidentialClientApplication
而不是 AuthenticationContext
(在本例中)。以下是示例应用程序的片段:
var cca = new ConfidentialClientApplication(clientId, redirectUri, new ClientCredential(appKey), userTokenCache, null);
string[] scopes = { "Mail.Read" };
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, scopes);
示例应用程序:https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect-v2
我正在尝试使用 OWIN OIDC 中间件授权代码,然后希望是刷新令牌。但是,我收到此错误: Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException: 'AADSTS50027: 无效的 JWT 令牌。 AADSTS50027:无效的 JWT 令牌。令牌格式无效。 跟踪 ID:8622dfea-05cd-4080-a52c-ec95a9593800 关联 ID:1cf57566-1e02-4856-a4bc-357d5b16ae8a
请注意,身份验证部分有效:我确实取回了原始 IdToken,并且触发了 SecurityTokenValidated Notifications 事件。上面的错误发生在 "AcquireTokenByAuthorizationCodeAsync" 行。
我想做的是在 Azure AD(上游)和我的客户端(下游)之间使用 IdentityServer 作为 IdP,我需要捕获刷新令牌以在客户端尝试使用时针对 AAD 进行验证下游刷新令牌,这样我就不会在 AAD 用户被锁定或删除时发出访问令牌。
var authority = "https://login.microsoftonline.com/xxx.onmicrosoft.com/v2.0";
var clientId = "xxx-30f5-47c2-9ddb-b5fcfd583f96";
var redirectUri = "http://localhost:60546/oidcCallback";
var clientSecret = "c8RRB4DCUiXMPEotQh2jm2ArgpYAqUMjGhDRKuuJOxxx";
var oidc = new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
Caption = "OIDC",
ResponseType = OpenIdConnectResponseTypes.CodeIdToken,
RedirectUri = redirectUri,
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters() { ValidateIssuer = false },
SignInAsAuthenticationType = signInAsType,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async e =>
{
var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(authority);
var result = await authContext.AcquireTokenByAuthorizationCodeAsync(e.ProtocolMessage.Code, new Uri(redirectUri), new ClientAssertion(clientId, clientSecret));
logger.Info(result.IdToken);
}
}
};
app.UseOpenIdConnectAuthentication(oidc);
谢谢!
我能看到的一件事是错误的,你应该使用 ClientCredential
,而不是 ClientAssertion
:
var result =
await authContext.AcquireTokenByAuthorizationCodeAsync(
e.ProtocolMessage.Code,
new Uri(redirectUri),
new ClientCredential(clientId, clientSecret));
然后是第二件事。您正在使用 ADAL,但似乎您正在使用 v2 端点。我假设您在 apps.dev.microsoft.com
?
在这种情况下,您应该使用 MSAL (https://www.nuget.org/packages/Microsoft.Identity.Client)。
MSAL 的 API 有点不同,您使用的 class 称为 ConfidentialClientApplication
而不是 AuthenticationContext
(在本例中)。以下是示例应用程序的片段:
var cca = new ConfidentialClientApplication(clientId, redirectUri, new ClientCredential(appKey), userTokenCache, null);
string[] scopes = { "Mail.Read" };
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, scopes);
示例应用程序:https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect-v2