【问题标题】:OpenIdConnectAuthenticationOptions and AcquireTokenByAuthorizationCodeAsync: Invalid JWT tokenOpenIdConnectAuthenticationOptions 和 AcquireTokenByAuthorizationCodeAsync:无效的 JWT 令牌
【发布时间】:2018-01-23 13:40:39
【问题描述】:

我正在尝试使用 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);

谢谢!

【问题讨论】:

    标签: oauth-2.0 owin azure-active-directory openid-connect adal


    【解决方案1】:

    我看到的一个错误是你应该使用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 有点不同,您使用名为 ConfidentialClientApplication 的类而不是 AuthenticationContext(在本例中)。这是来自示例应用程序的 sn-p:

    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

    【讨论】:

    • 太好了,谢谢!使用这些提示,我能够让它同时适用于 v1 和 v2 端点(我错过了多个重要的区别)。
    猜你喜欢
    • 2021-04-13
    • 2019-03-19
    • 2021-09-25
    • 1970-01-01
    • 2018-07-14
    • 2020-04-19
    • 2016-10-20
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多