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

.NET 4.8 MVC用托管身份连接Azure SQL存储Session的方案求助

.NET 4.8 MVC通过托管身份连接Azure SQL存储Session解决方案

方案1:自定义SessionState存储提供程序

.NET 4.8默认SQLServer SessionState提供程序不支持托管身份认证,可基于Microsoft.Data.SqlClient(支持Azure AD托管身份)自定义实现:

  1. 安装兼容.NET 4.8的NuGet包:Microsoft.Data.SqlClient、Microsoft.Azure.Services.AppAuthentication
  2. 自定义SessionState提供程序类,通过托管身份获取令牌建立连接:
public class ManagedIdentitySessionProvider : SessionStateStoreProviderBase
{
    private string _connStr;
    private readonly AzureServiceTokenProvider _tokenProvider = new AzureServiceTokenProvider();

    public override void Initialize(string name, NameValueCollection config)
    {
        base.Initialize(name, config);
        _connStr = config["sqlConnectionString"];
    }

    private SqlConnection GetAuthenticatedConnection()
    {
        var conn = new SqlConnection(_connStr);
        // 注入Azure SQL托管身份访问令牌
        conn.AccessToken = _tokenProvider.GetAccessTokenAsync("https://database.windows.net/").Result;
        return conn;
    }

    // 实现SessionStateStoreProviderBase的必需方法(CreateNewStoreData、GetItem、SetItem等)
    // 逻辑参考默认SQLServerSessionStateProvider,替换连接为GetAuthenticatedConnection()返回的实例
}
  1. 在web.config中配置自定义提供程序:
<sessionState mode="Custom" customProvider="ManagedIdentitySessionProvider">
  <providers>
    <add name="ManagedIdentitySessionProvider" 
         type="YourProjectNamespace.ManagedIdentitySessionProvider, YourProjectAssembly"
         sqlConnectionString="Server=some-azure-sql-db.database.windows.net,1433;Database=ASPState;" />
  </providers>
</sessionState>

方案2:拦截SQL连接注入托管身份令牌(适配默认SessionState提供程序)

无需完全自定义提供程序,通过注册SQL认证拦截器实现:

  1. 安装NuGet包:Microsoft.Data.SqlClient、Microsoft.Azure.Services.AppAuthentication
  2. 在Global.asax的Application_Start中注册认证拦截器:
protected void Application_Start()
{
    // 注册托管身份认证提供程序
    SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryManagedIdentity, 
        new ManagedIdentitySqlAuthProvider());
}

public class ManagedIdentitySqlAuthProvider : SqlAuthenticationProvider
{
    private readonly AzureServiceTokenProvider _tokenProvider = new AzureServiceTokenProvider();

    public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenticationParameters parameters)
    {
        var token = await _tokenProvider.GetAccessTokenAsync("https://database.windows.net/");
        return new SqlAuthenticationToken(token, DateTime.UtcNow.AddMinutes(5));
    }

    public override bool IsSupported(SqlAuthenticationMethod authenticationMethod)
    {
        return authenticationMethod == SqlAuthenticationMethod.ActiveDirectoryManagedIdentity;
    }
}
  1. 修改web.config的sessionState连接字符串,使用托管身份认证:
<sessionState
    cookieName="MySession" cookieSameSite="Strict" mode="SQLServer"
    sqlConnectionString="Server=some-azure-sql-db.database.windows.net,1433;Database=ASPState;Authentication=Active Directory Managed Identity" />

注意:需将项目中所有System.Data.SqlClient引用替换为Microsoft.Data.SqlClient,旧版本不支持该认证方式。

通用注意事项

  • 权限配置:给托管身份分配Azure SQL数据库权限,示例SQL语句:
CREATE USER [你的托管身份名称] FROM EXTERNAL PROVIDER;
ALTER ROLE db_owner ADD MEMBER [你的托管身份名称];
  • 本地测试:本地开发时可通过Azure CLI登录,AzureServiceTokenProvider会自动复用CLI身份认证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:02:20