具有 AAD 身份验证的 EF6 在本地工作,但不适用于 Azure 中已部署的应用

EF6 with AAD auth works locally, but not on deployed app in Azure

提问人:ØTS 提问时间:1/26/2023 最后编辑:ØTS 更新时间:1/26/2023 访问量:165

问:

我正在使用 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相对应。基于代码的配置也已经过测试,但未成功解决此问题。

azure-active-directory azure-web-app-service entity-framework-6 system.data.sqlclient

评论

0赞 ErikEJ 1/26/2023
随意通过 Github 分享复制项目
0赞 ErikEJ 1/27/2023
Web.config 在部署时是否正确配置?
0赞 ØTS 1/27/2023
目前我没有可用的复制项目,但我想我可以试一试。部署的 web.config 在我看来配置正确。
1赞 ØTS 2/2/2023
@ErikEJ - 我想通了。在 Azure 中,连接字符串是在门户中配置的。使用此选项时,将忽略 web.config 连接字符串中定义的提供程序,从而导致 EF 使用 System.Data.SqlClient。因此,我们放弃了在 Azure 门户中配置 connectionstring 并转换 web.config。现在它就像一个魅力。

答: 暂无答案