首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MsalServiceException: AADSTS90023:公共客户端不能发送客户端机密

MsalServiceException: AADSTS90023:公共客户端不能发送客户端机密
EN

Stack Overflow用户
提问于 2017-09-18 15:43:19
回答 2查看 1.2K关注 0票数 0

我已经创建了一个github问题,以防这是一个bug。

问题

我试图登录到一个ASP.Net Core2WebApp,使用MSAL的Azure。

当我调用AcquireTokenByAuthorizationCodeAsync时,会收到一条错误消息。

MsalServiceException: AADSTS90023: Public clients can't send a client secret.

编写代码的例子并不多,但存在的东西显示ClientSecret作为ClientCredential传递给ConfidentialClientApplication

这是双重混淆,因为错误消息引用的PublicClientApplication不是我正在使用的,我使用的是ConfidentialClientApplication

下面是发生错误的完整方法:

代码语言:javascript
运行
复制
public void Configure(string name, OpenIdConnectOptions options)
{
    options.Authority = $"{azureADOptions.Instance}{azureADOptions.TenantId}";
    options.CallbackPath = azureADOptions.CallbackPath;
    options.ClientId = azureADOptions.ClientId;
    options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
    options.UseTokenLifetime = true;

    options.Events = new OpenIdConnectEvents
    {
        OnAuthorizationCodeReceived = async context =>
        {
            var clientID = options.ClientId;
            var authority = options.Authority;
            var redirectUri = this.azureADOptions.RedirectUri;
            var clientCredentials = new ClientCredential(azureADOptions.ClientSecret);
            var tokenCache = AzureADUtils.GetTokenCache(context.HttpContext, context.Principal);

            var clientApp = new ConfidentialClientApplication(clientID, authority, redirectUri, clientCredentials, tokenCache, null);

            try
            {
                var code = context.ProtocolMessage.Code;
                var scopes = new[]
                {
                    AzureADScopes.User.ReadBasicAll,
                    AzureADScopes.Group.ReadAll
                };

                //AJ: This line is where the exception is thrown.
                var result = await clientApp.AcquireTokenByAuthorizationCodeAsync(code, scopes);

                context.HandleCodeRedemption(result.AccessToken, result.IdToken);
            }
            catch (Exception)
            {
                throw;
            }
        }
    };
}

错误消息似乎来自服务器端,而不是生成的客户端,这对于为什么我正在使用的*ClientApplication类类型感到困惑更有意义。

请求与响应

以下是我发送的请求:

代码语言:javascript
运行
复制
POST https://login.microsoftonline.com/[REMOVED]/oauth2/v2.0/token HTTP/1.1
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Accept: application/json
Cookie: x-ms-gateway-slice=006; stsservicecookie=ests; esctx=[REMOVED]
x-client-SKU: MSAL.CoreCLR
x-client-Ver: 1.1.0.0
x-client-OS: Microsoft Windows 10.0.15063 
client-request-id: [REMOVED]
return-client-request-id: true
x-ms-request-root-id: [REMOVED]
x-ms-request-id: [REMOVED]
Request-Id: [REMOVED]
Content-Length: 981
Host: login.microsoftonline.com

client_id=[REMOVED]
&client_info=1
&client_secret=[REMOVED]
&scope=Group.Read.All+offline_access+openid+profile+User.ReadBasic.All
&grant_type=authorization_code
&code=[REMOVED]
&redirect_uri=https%3A%2F%2Flocalhost%3A44365%2Fsignin-oidc

我得到的回应是:

代码语言:javascript
运行
复制
{
    "error": "invalid_request",
    "error_description": "AADSTS90023: Public clients can't send a client secret.\r\nTrace ID: [REMOVED]\r\nCorrelation ID: [REMOVED]\r\nTimestamp: 2017-09-18 16:12:51Z",
    "error_codes": [90023],
    "timestamp": "2017-09-18 16:12:51Z",
    "trace_id": "[REMOVED]",
    "correlation_id": "[REMOVED]"
}

这与这篇MSDN博客文章在标题“步骤2-获取访问令牌”下描述的非常接近。

应用程序注册

我创建了一个“聚合”应用程序注册,它应该使用Azure v2应用程序模型。

它只有一个应用程序秘密,一个密码,用作客户端机密。

它只有一个平台,即Web,启用了允许隐式流,有一个重定向URL集,并且没有注销URL。

EN

Stack Overflow用户

发布于 2022-11-10 13:52:05

我知道这个职位很旧,但我只是遇到了同样的问题。由于在这里找到的文档:https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Client-credential-flows,我找到了一个解决方案。

我的代码现在适用于:

代码语言:javascript
运行
复制
var app = ConfidentialClientApplicationBuilder.Create(options.ClientId)
            .WithClientSecret(options.ClientSecret)
            .WithRedirectUri("https://localhost:7001/signin-oidc")
            .Build();

var result = await app.AcquireTokenByAuthorizationCode(options.Scope, context.ProtocolMessage.Code)
            .WithAuthority(AzureCloudInstance.AzurePublic, options.TenantId)
            .ExecuteAsync();

要非常小心地使用用户同意的作用域,WithAuthority方法参数中不使用commonorganization作为租户id,而是使用租户id ( guid )。

希望这是帮助!

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46283334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档