Azure AD Microsoft 帐户客户端是公开的,因此不应显示“client_assertion”和“client_secret”

Pau*_*ode 7 .net azure azure-active-directory razor-pages

我遇到以下问题:

异常:OAuth 令牌端点失败:状态:正文:{“error”:“invalid_client”,“error_description”:“AADSTS700025:客户端是公共的,因此不应显示“client_assertion”和“client_secret”}。

我正在使用 Microsoft.AspNetCore.Authentication.Microsoft 帐户库

Program file

builder.Services.AddAuthentication()
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
    options.LoginPath = "/page";
    options.LogoutPath = "/page";
    options.AccessDeniedPath = "/page?code={0}";
    options.ExpireTimeSpan = TimeSpan.FromMinutes(tiempoDeSesion);
    options.Cookie.Name = ".CookieName.Sec";
    options.SlidingExpiration = true;
})
.AddMicrosoftAccount(microsoftOptions =>
{
    microsoftOptions.ClientId = builder.Configuration["AzureAd:ClientId"];
    microsoftOptions.ClientSecret = builder.Configuration["AzureAd:ClientSecret"];
    microsoftOptions.CallbackPath = new PathString("/signin-microsoft-token");
    microsoftOptions.AuthorizationEndpoint = $"https://login.microsoftonline.com/{builder.Configuration["AzureAd:TenantId"]}/oauth2/v2.0/authorize";
    microsoftOptions.TokenEndpoint = $"https://login.microsoftonline.com/{builder.Configuration["AzureAd:TenantId"]}/oauth2/v2.0/token";
    microsoftOptions.Scope.Add("https://graph.microsoft.com/user.read");
    microsoftOptions.SaveTokens = true;
    microsoftOptions.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
    microsoftOptions.ClaimActions.MapJsonKey(ClaimTypes.Name, "displayName");
    microsoftOptions.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "givenName");
    microsoftOptions.ClaimActions.MapJsonKey(ClaimTypes.Surname, "surname");
    microsoftOptions.ClaimActions.MapCustomJson(ClaimTypes.Email,
                                   user => user.GetString("mail") ?? user.GetString("userPrincipalName"));
});
Run Code Online (Sandbox Code Playgroud)

Ruk*_*ini 12

如果您使用公共客户端应用程序并传递来生成访问令牌,通常会出现错误“AADSTS700025:客户端是公共的,因此不应显示 'client_assertion' 和 'client_secret'” 。client_secret

您可以验证您的应用程序是否是公共客户端,如下所示:

在此输入图像描述

移动和桌面应用程序是公共客户端。如果您希望 Azure AD 应用程序公开,则可以client_secret通过在代码中排除以下行来避免提供参数:

microsoftOptions.ClientSecret = builder.Configuration["AzureAd:ClientSecret"];
Run Code Online (Sandbox Code Playgroud)

排除 后client_secret,尝试生成访问令牌。

如果您希望您的应用程序保密,请确保更改现有的 Azure AD 应用程序/创建新的 Azure AD 应用程序作为WEB,如下所示:

转到 Azure 门户 -> Azure Active Directory -> 应用程序注册 -> 您的应用程序 -> 身份验证 -> 保存

在此输入图像描述

此配置将使您的 Azure AD 应用程序保密,并且您可以client_secret通过生成访问令牌。

我尝试通过Postman在我的环境中重现相同的内容,并成功获取 Web 应用程序的访问令牌,如下所示:

POST https://login.microsoftonline.com/TenantId/oauth2/v2.0/token
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

注意,公共应用程序受到限制,它们不能传递任何秘密。

参考:

公共和机密客户端应用程序 (MSAL) - Microsoft Entra