issue on githubが作成されました。これはバグです。MsalServiceException:AADSTS90023:パブリッククライアントはクライアントシークレットを送信できません
PROBLEM
私はMSALとAzureのADを使用して、ASP.NetのCore 2 Webアプリケーションにログインしようとしています。
AcquireTokenByAuthorizationCodeAsync
と私はエラーメッセージが表示されます。
MsalServiceException: AADSTS90023: Public clients can't send a client secret.
。
あり、私がやっている正確に何をしてコーディングの多くの例がありませんが、what does existはClientSecret
がClientCredential
としてConfidentialClientApplication
に渡されて表示されます。
エラーメッセージにPublicClientApplication
が表示されていますが、これは私が使用しているものではないため、私はConfidentialClientApplication
を使用しています。
CODE
ここでエラーが発生し、完全な方法です:
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
クラスのタイプについて混乱している理由について、もう少し理解してください。
REQUEST &応答
ここに私が送るリクエストです:
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]"
}
これはthis MSDN Blog postに記載されているものに非常に近いですが、 「ステップ2 - アクセストークンを取得する」という見出しの下に表示されます。
APPの登録
私はアズールAD v2のアプリモデルを使用する必要があり、 "統合型" アプリケーション登録を作成しました。
これには、Client Secretとして使用される単一のApplication Secret、Passwordがあります。
これには、単一のプラットフォーム、Web、Allow Implicit Flow、1つのリダイレクトURLセット、およびログアウトURLはありません。私は首尾よくそれを使用しているhttps://azure.microsoft.com/en-gb/resources/samples/active-directory-dotnet-webapp-openidconnect-aspnetcore/
: