You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET集成中如何避免过期客户端密钥导致SSO失效

替代客户端密钥实现Microsoft SSO的方案(证书/托管标识)

针对你提到的ClientSecret过期导致SSO无预警失效的问题,以下是两种无需使用客户端密钥的实现方案,覆盖ASP.NET Core和.NET Framework应用:

一、使用证书验证身份

证书是替代ClientSecret的通用方案,支持所有部署环境,有效期可设置为1-5年,大幅减少凭据更新频率。

1. ASP.NET Core 配置

首先在Azure AD应用注册的「证书和密码」页面上传证书(支持.cer公钥或.pfx私钥文件),然后在代码中配置:

builder.Services.AddAuthentication()
    .AddMicrosoftAccount(options =>
    {
        options.ClientId = "你的应用ClientId";
        // 从本地文件加载证书,推荐从密钥管理服务(如Azure Key Vault)加载
        var cert = new X509Certificate2("path/to/cert.pfx", "证书密码(若有)");
        options.ClientCertificate = cert;
        // 无需设置ClientSecret
    });

如果证书存储在本地机器的证书库,可通过指纹加载:

var cert = CertificateLoader.LoadFromStoreCert(
    thumbprint: "你的证书指纹",
    storeName: StoreName.My,
    storeLocation: StoreLocation.CurrentUser,
    validOnly: false);
options.ClientCertificate = cert;

2. .NET Framework 配置

对于传统ASP.NET应用,在Startup.Auth.cs中配置OWIN中间件:

app.UseMicrosoftAccountAuthentication(new MicrosoftAccountAuthenticationOptions
{
    ClientId = "你的应用ClientId",
    ClientCertificate = new X509Certificate2(
        Server.MapPath("~/App_Data/your-cert.pfx"), 
        "证书密码"
    ),
    Provider = new MicrosoftAccountAuthenticationProvider
    {
        OnAuthenticated = context =>
        {
            // 自定义用户信息处理逻辑
            return Task.CompletedTask;
        }
    }
});

注意:确保应用池账户拥有证书的读取权限,避免加载失败。

二、使用托管标识(Azure托管应用专属)

如果你的应用部署在Azure App Service、VM、AKS等Azure服务上,托管标识可以完全消除手动凭据管理,Azure会自动维护身份验证令牌。

1. ASP.NET Core 配置

  1. 给Azure服务启用系统分配或用户分配的托管标识;
  2. 在Azure AD应用注册中,给托管标识授予对应的API权限;
  3. 代码中启用托管标识支持:
builder.Services.AddAuthentication()
    .AddMicrosoftAccount(options =>
    {
        options.ClientId = "你的应用ClientId";
        options.UseManagedIdentity = true;
        // 若使用用户分配的托管标识,指定其ClientId
        // options.ManagedIdentityClientId = "托管标识ClientId";
    });

框架会自动通过Azure实例元数据服务(IMDS)获取令牌,无需手动配置任何凭据。

2. .NET Framework 配置

需要借助Azure.Identity库实现托管标识令牌获取:

  1. 安装Azure.Identity NuGet包;
  2. 在Startup.Auth.cs中自定义令牌获取逻辑:
app.UseMicrosoftAccountAuthentication(new MicrosoftAccountAuthenticationOptions
{
    ClientId = "你的应用ClientId",
    Provider = new MicrosoftAccountAuthenticationProvider
    {
        OnCreatingTicket = async context =>
        {
            var credential = new DefaultAzureCredential();
            var token = await credential.GetTokenAsync(
                new TokenRequestContext(new[] { "https://login.microsoftonline.com/你的租户ID/oauth2/v2.0/token" })
            );
            context.AccessToken = token.Token;
        }
    }
});

确保应用所在的Azure服务已启用托管标识,且拥有访问Microsoft身份验证服务的权限。

关键注意事项

  • 证书更新:证书到期前需提前上传新证书到Azure AD,并更新应用配置,可通过自动化脚本(如Azure CLI)批量处理,减少手动操作;
  • 托管标识限制:仅适用于Azure托管的应用,本地部署的应用无法使用;
  • 旧系统兼容:.NET Framework应用需确保OWIN中间件版本≥4.0,避免兼容性问题。

内容的提问来源于stack exchange,提问作者tappetyclick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:06:02