Azure AD认证能否在请求头/体传递ClientId与Authority及如何读取认证配置
问题解答
关于ClientId、TenantId是否可以放在请求体/请求头中传递
- 你当前使用的
code id_token响应类型属于OIDC标准授权码流,按照OIDC核心规范要求,授权请求默认必须通过GET重定向方式发起,相关参数(包括client_id、tenant_id)默认会放在URL Query中传递,Azure AD的授权端点原生不支持通过POST请求体接收授权请求参数。 - 补充说明:ClientId、TenantId本身不属于敏感信息,设计上就是允许公开出现在跳转URL、前端代码中的,真正需要保密的是ClientSecret,只要不把ClientSecret泄露到前端即可。
- 如果确实需要避免参数明文出现在URL中,可以使用OIDC的
request参数方案:将所有授权请求参数打包加密为一个JWT字符串,仅传递这一个参数到Azure AD,Azure AD支持该特性,你可以通过自定义OpenIdConnect中间件的RedirectToIdentityProvider事件实现:
RedirectToIdentityProvider = context => { // 构造包含所有参数的JWT作为request参数,替换原有明文参数 return Task.CompletedTask; }
如何获取已存储的AuthenticationProperties并检索指定属性
分两种场景实现:
- 认证流程中(如OIDC事件回调内):可以直接从事件上下文的AuthenticationTicket中读取,示例如下:
SecurityTokenValidated = context => { var properties = context.AuthenticationTicket.Properties; // 检索指定属性 var targetValue = properties.Dictionary["自定义属性名"]; return Task.CompletedTask; }
- 认证完成后(业务代码中):通过OWIN上下文的认证管理器读取:
var owinContext = HttpContext.GetOwinContext(); var authResult = await owinContext.Authentication.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationType); if (authResult != null) { var properties = authResult.Properties; var targetValue = properties.Dictionary["自定义属性名"]; }
如何读取已注册的OpenIdConnectAuthenticationOptions配置做校验
推荐的实现方式是在注册中间件时就将配置实例存储起来,方便后续读取校验,示例如下:
// 先实例化配置对象 var oidcOptions = new OpenIdConnectAuthenticationOptions("MyDomain") { ClientId = clientId, Authority = authority, // 其余配置项 }; // 注册中间件 app.UseOpenIdConnectAuthentication(oidcOptions); // 将配置实例存入静态变量或你的依赖注入容器 // 例如存入全局静态类 AppGlobalConfig.OidcAuthenticationOptions = oidcOptions;
后续需要校验时,直接读取存储的OidcAuthenticationOptions实例的所有属性即可,无需额外从OWIN管道中反向查找。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

