为何Microsoft Identity Platform会忽略Azure AD应用中创建的客户端密钥?
这核心原因是你的ASP.NET Core MVC应用在认证流程中使用了**PKCE(Proof Key for Code Exchange)**机制,它替代了客户端密钥的身份验证作用,具体细节如下:
Visual Studio默认启用PKCE:通过Visual Studio配置Azure AD认证时,生成的代码会自动在OpenID Connect配置里开启PKCE。PKCE原本是为无法安全存储密钥的公共客户端(比如桌面、移动应用)设计的安全扩展,现在也被推荐用于机密客户端(如MVC Web应用)。它通过生成随机的
code_verifier和code_challenge来验证授权码请求的合法性,不用依赖客户端密钥就能防止授权码被劫持。Web应用认证流程的特性:你的MVC应用属于Web应用(机密客户端),但在授权码流程搭配PKCE的情况下,Azure AD允许省略客户端密钥。因为PKCE机制已经能充分证明请求来自合法客户端,不需要额外的密钥验证步骤。
默认配置的行为:查看
Program.cs里的认证代码,类似这样的默认配置会自动启用PKCE:builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));AddMicrosoftIdentityWebApp方法内部会自动处理PKCE的启用逻辑,只要你的Azure AD应用注册是Web应用类型,单纯的登录(获取ID令牌)操作就不需要客户端密钥。
补充说明:如果你的应用需要调用下游API,此时就必须配置客户端密钥或客户端证书,因为调用API需要用客户端凭据来获取访问令牌。但仅实现用户登录功能时,PKCE就足够完成安全认证。
内容的提问来源于stack exchange,提问作者John John

