如何配置Microsoft.Identity.Web使用托管身份断言凭据替代客户端密钥?
配置Microsoft.Identity.Web使用无密钥身份验证(基于托管标识)
1. 代码直接配置托管标识凭据
你可以在注册Microsoft.Identity.Web服务时,直接指定使用ManagedIdentityCredential,无需配置客户端密钥或证书:
builder.Services.AddMicrosoftIdentityWebApp(builder.Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches() .AddClientCredentials(new[] { "api://你的下游API范围/.default" }, options => { // 传入你的托管标识客户端ID options.Credential = new ManagedIdentityCredential(managedIdentityClientId: "你的托管标识ClientID"); });
这种方式直接绕过传统客户端凭据配置,让包直接使用托管标识获取访问令牌。
2. 配置文件驱动的无密钥配置
如果偏好通过配置文件管理,可在appsettings.json中添加ClientCredentials节点,指定凭据类型为ManagedIdentity:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "你的租户ID", "ClientId": "你的Web应用ClientID", "ClientCredentials": [ { "Type": "ManagedIdentity", "ManagedIdentityClientId": "你的托管标识ClientID" } ] }
然后代码中只需常规注册:
builder.Services.AddMicrosoftIdentityWebApp(builder.Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches() .AddClientCredentials();
Microsoft.Identity.Web会自动根据配置中的Type创建对应的凭据实例。如果是Azure Kubernetes工作负载身份联合,只需将Type改为WorkloadIdentity,并确保集群已配置好工作负载身份相关环境变量(如AZURE_CLIENT_ID、AZURE_TENANT_ID)。
3. 关于ClientAssertionCredential的替代方案
如果确实需要使用ClientAssertionCredential,可以通过托管标识获取断言令牌后构建实例,但这种方式没必要——ManagedIdentityCredential已经封装了所有令牌获取逻辑,直接使用更简洁。如果一定要实现,示例代码如下:
var tenantId = "你的租户ID"; var managedIdentityClientId = "你的托管标识ClientID"; var appClientId = "你的Web应用ClientID"; var managedIdentityCredential = new ManagedIdentityCredential(managedIdentityClientId); // 获取用于客户端断言的令牌,目标受众为微软身份平台令牌端点 var assertionToken = await managedIdentityCredential.GetTokenAsync( new TokenRequestContext(new[] { $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token" })); var clientAssertionCredential = new ClientAssertionCredential( tenantId, appClientId, assertionToken.Token); // 将构建好的凭据传入Microsoft.Identity.Web builder.Services.AddMicrosoftIdentityWebApp(builder.Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches() .AddClientCredentials(new[] { "api://你的下游API范围/.default" }, options => { options.Credential = clientAssertionCredential; });
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

