.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托管身份)自定义实现:
- 安装兼容.NET 4.8的NuGet包:
Microsoft.Data.SqlClient、Microsoft.Azure.Services.AppAuthentication - 自定义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()返回的实例 }
- 在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认证拦截器实现:
- 安装NuGet包:
Microsoft.Data.SqlClient、Microsoft.Azure.Services.AppAuthentication - 在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; } }
- 修改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
相关产品推荐
相关产品推荐

