我已经创建了一个github问题,以防这是一个bug。
问题
我试图登录到一个ASP.Net Core2WebApp,使用MSAL的Azure。
当我调用AcquireTokenByAuthorizationCodeAsync
时,会收到一条错误消息。
MsalServiceException: AADSTS90023: Public clients can't send a client secret.
。
编写代码的例子并不多,但存在的东西显示ClientSecret
作为ClientCredential
传递给ConfidentialClientApplication
。
这是双重混淆,因为错误消息引用的PublicClientApplication
不是我正在使用的,我使用的是ConfidentialClientApplication
。
码
下面是发生错误的完整方法:
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
类类型感到困惑更有意义。
请求与响应
以下是我发送的请求:
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
我得到的回应是:
{
"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。
发布于 2022-11-10 13:52:05
我知道这个职位很旧,但我只是遇到了同样的问题。由于在这里找到的文档:https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Client-credential-flows,我找到了一个解决方案。
我的代码现在适用于:
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
方法参数中不使用、common
或organization
作为租户id,而是使用租户id ( guid )。
希望这是帮助!
https://stackoverflow.com/questions/46283334
复制相似问题