已添加client secret的Azure AD应用注册无需密钥仍可认证是否正常?
问题解答:为什么Azure AD认证无需Client Secret仍可成功?
这是正常行为,核心原因和OpenID Connect的流程设计、你的代码配置有关,具体说明如下:
1. OpenID Connect流程的差异
你当前的配置默认触发了隐式流(Implicit Flow)(或混合流中仅请求ID Token的场景),这种流程原本是为无法安全存储Client Secret的公开客户端(比如SPA、纯前端应用)设计的。当你仅获取ID Token用于用户身份验证、不请求Access Token调用后端API时,Azure AD会通过预先在应用注册中配置的重定向URI来验证应用合法性——只有匹配注册过的URI才能接收回调,以此确保请求来自授权应用,无需额外的Client Secret验证。
2. Client Secret的核心作用场景
Client Secret并非所有认证场景都必需:
- 它主要用于授权码流(Authorization Code Flow)中交换Access Token的环节,或是当你的应用需要调用Azure AD保护的第三方API时,用来证明应用自身的身份。
- 单纯的用户登录(仅获取ID Token)不属于需要Client Secret验证的场景,Azure AD信任重定向URI的配置即可完成身份验证。
3. 你的代码配置分析
你提供的OpenIdConnectAuthenticationOptions未指定ResponseType,OWIN的OpenID Connect中间件默认会使用id_token作为响应类型,这直接触发了隐式流的逻辑。在这种模式下,Azure AD不会要求提供Client Secret,因此你能正常获取ID Token。
4. 如何强制要求Client Secret验证
如果需要确保认证请求必须携带Client Secret,可按以下步骤修改:
- 在Azure Portal的应用注册页面,进入「认证」标签,将应用标记为机密客户端(而非公共客户端)。
- 在代码中明确启用授权码流,并添加Client Secret配置:
配置完成后,只有携带正确Client Secret的请求才能完成授权码到Token的交换,否则会被Azure AD拒绝。app.UseOpenIdConnectAuthentication(New OpenIdConnectAuthenticationOptions() With { .ClientId = clientId, .ClientSecret = clientSecret, ' 添加Client Secret配置 .Authority = authority, .RedirectUri = redirectUri, .PostLogoutRedirectUri = postLogoutRedirectUri, .ResponseType = "code", ' 指定授权码流响应类型 .Notifications = New OpenIdConnectAuthenticationNotifications() With { .AuthenticationFailed = Function(context) System.Threading.Tasks.Task.FromResult(0), .SecurityTokenValidated = Function(context) Return OnSecurityTokenValidated(context) End Function }} )
内容的提问来源于stack exchange,提问作者n4esa
相关产品推荐
相关产品推荐

