提问人:ØTS 提问时间:1/26/2023 最后编辑:ØTS 更新时间:1/26/2023 访问量:165
具有 AAD 身份验证的 EF6 在本地工作,但不适用于 Azure 中已部署的应用
EF6 with AAD auth works locally, but not on deployed app in Azure
问:
我正在使用 EF6 开发 .Net 4.8 应用程序。已将 Decission 更改为使用 AAD 身份验证,因此我们使用 ErikEJs ErikEJ.EntityFramework.SqlServer 库实现了 Microsoft.Data.SqlClient 的使用。
最初继承的应用 DBContext,它在内部使用 System.Data.SqlClient。为了解决这个问题,我已将模型创建等从此基类移动到应用程序 DBContext 中,试图避免使用 System.Data.SqlClient。Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext<TUser>
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext() : base("DefaultConnection")
{}
//Identity
public virtual IDbSet<ApplicationUser> Users { get; set; }
public virtual IDbSet<IdentityRole> Roles { get; set; }
public bool RequireUniqueEmail { get; set; }
//Other models...
public virtual DbSet<LogEntry> LogEntries { get; set; }
public virtual DbSet<Form> Forms { get; set; }
.....
}
我已按照文档在web.config中配置了实体框架。
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="DefaultConnection" providerName="Microsoft.Data.SqlClient" connectionString="Server=tcp:someserver.database.windows.net;Authentication=Active Directory Default;Encrypt=False;TrustServerCertificate=True;Database=our_database;" />
</connectionStrings>
<entityFramework>
<providers>
<provider invariantName="Microsoft.Data.SqlClient" type="System.Data.Entity.SqlServer.MicrosoftSqlProviderServices, ErikEJ.EntityFramework.SqlServer" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlClient"/>
<add name="SqlClient Data Provider"
invariant="Microsoft.Data.SqlClient"
description=".NET Framework Data Provider for SqlServer"
type="Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient" />
</DbProviderFactories>
</system.data>
.
.
<configuration>
我已经在本地测试了连接到 azure 数据库的应用程序。dbcontext 能够连接到数据库并按预期工作。但是,当我们将应用部署到 Azure 时,dbcontext 无法连接到数据库,从而导致异常,并显示消息“密钥'身份验证'的值无效”。为了验证应用程序是否真的能够连接到数据库,我实施了对数据库执行“选择 1”的运行状况检查。这很有效。
堆栈跟踪指示已部署的应用出于某种奇怪的原因仍在 dbcontext 中使用 System.Data.SqlClient。
at System.Data.Common.DbConnectionStringBuilderUtil.ConvertToAuthenticationType(String keyword, Object value)
at System.Data.SqlClient.SqlConnectionString.ConvertValueToAuthenticationType()
at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)
at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)
at System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.SetConnectionString(DbConnection connection, DbConnectionPropertyInterceptionContext`1 interceptionContext)
at System.Data.Entity.Internal.LazyInternalConnection.TryInitializeFromAppConfig(String name, AppConfig config)
at System.Data.Entity.Internal.LazyInternalConnection.Initialize()
at System.Data.Entity.Internal.LazyInternalConnection.get_Connection()
at Myapp.HealthChecks.HealthCheckImpls.DatabaseEntityFrameworkHealthCheck.CheckStatus() in C:\dev\TeamCity\buildAgent\work\9a6b8feb000b85a8\Myapp\Services\HealthChecks\HealthCheckImpls\DatabaseEntityFrameworkHealthCheck.cs:line 23
我已经检查了web.config是否与我在本地使用的web.config相对应。基于代码的配置也已经过测试,但未成功解决此问题。
答: 暂无答案
评论