.net - Azure AD Microsoft 帐户客户端是公共(public)的,因此不应显示 'client_assertion' 和 'client_secret'

标签 .net azure azure-active-directory razor-pages

我遇到以下问题:

异常:OAuth token 端点失败:状态: 正文:{“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"));
});

最佳答案

如果您使用公共(public)客户端应用程序并传递client_secret 生成访问 token 。

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

enter image description here

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

microsoftOptions.ClientSecret = builder.Configuration["AzureAd:ClientSecret"];

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

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

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

enter image description here

此配置将使您的 Azure AD 应用程序保密,您可以传递 client_secret 来生成访问 token 。

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

POST https://login.microsoftonline.com/TenantId/oauth2/v2.0/token

enter image description here

注意公共(public)应用程序受到限制,它们不能传递任何 secret 。

引用:

Public and confidential client apps (MSAL) - Microsoft Entra

关于.net - Azure AD Microsoft 帐户客户端是公共(public)的,因此不应显示 'client_assertion' 和 'client_secret',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73766505/

相关文章:

azure-active-directory - 使用 Azure AD 进行 Blazor 身份验证 - 检索用户角色

c# - 为什么在包含 System.Collections.Generic 时无法使用 SynchronizedCollection?

java - 无需安装先决条件即可为 Windows 创建独立程序的最佳方法?

azure - 在 Azure 上设置 Lync 服务器

Azure 应用程序洞察

azure - Azure Web 应用程序请求的资源中不存在 'Access-Control-Allow-Origin' header

azure - 从 Azure Active Directory 获取邮件昵称

c# - BinaryWriter Endian 问题

.net - 通过 NHibernate 使用无状态 session 渴望获取曾孙集合

powershell - 来自 PowerShell Azure WebJob 的 "Window title cannot be longer than 1023 characters"