部署到 Azure 应用服务时,Asp.net 成员资格提供程序无法连接到本地 SQL Server

Posted

技术标签:

【中文标题】部署到 Azure 应用服务时,Asp.net 成员资格提供程序无法连接到本地 SQL Server【英文标题】:Asp.net Membership provider fails to connect to on premise SQL Server when deployed to Azure app service 【发布时间】:2021-10-14 23:17:38 【问题描述】:

我正在尝试将我的一个 asp.net MVC (V 4.0/ .Net Framework 4.5) 作为应用服务移植到 Azure。我的数据库是 SQL Server,我的应用程序使用Hybrid Connection 连接到它。我的应用程序使用 SQL 身份验证连接到数据库。当部署到我们本地托管的服务器之一上的 IIS 服务器时,一切正常,但是当作为应用服务部署到 Azure 时,身份验证功能会中断。

我的控制器代码:

[HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public virtual ActionResult Login(LoginModel model, string returnUrl)
        
            if (ModelState.IsValid)
            
                //var v = Membership.GetAllUsers();
                try
                
                    if (Membership.ValidateUser(model.UserName, model.Password))
                    
                        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                        if (Url.IsLocalUrl(returnUrl))
                        
                            return Redirect(returnUrl);
                        
                        else
                        
                            return RedirectToAction("Index", "Home");
                        
                    
                    else
                    
                        ModelState.AddModelError("", "The user name or password provided is incorrect.");
                    
                
                catch (Exception ex)
                
                    ModelState.AddModelError("", ex.ToString());
                
                
            

Azure 上的错误:

System.Data.SqlClient.SqlException (0x80131904): 用户登录失败 '操作系统用户'。在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity 身份、SqlConnectionString 连接选项、SqlCredential 凭证、对象 providerInfo、字符串 newPassword、SecureString newSecurePassword、布尔重定向用户实例、SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool 池,字符串 accessToken,布尔值 applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo, DbConnectionPool 池,DbConnection owningConnection, DbConnectionOptions 用户选项)在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool 池,DbConnection owningObject,DbConnectionOptions 选项, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) 在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal 旧连接)在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal 旧连接)在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean 允许创建、布尔型仅OneCheckConnection、DbConnectionOptions userOptions,DbConnectionInternal& 连接)在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 重试,DbConnectionOptions 用户选项、DbConnectionInternal oldConnection、DbConnectionInternal& 连接)在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection 外部连接,DbConnectionFactory 连接工厂, TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions) 在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 重试)在 System.Data.SqlClient.SqlConnection.Open() 在 System.Web.DataAccess.SqlConnectionHolder.Open(HttpContext 上下文, Boolean revertImpersonate) 在 System.Web.DataAccess.SqlConnectionHelper.GetConnection(字符串 connectionString, Boolean revertImpersonation) 在 System.Web.Security.SqlMembershipProvider.GetPasswordWithFormat(字符串 用户名、布尔值 updateLastLoginActivityDate、Int32& 状态、字符串& 密码,Int32&密码格式,字符串&密码盐,Int32& failedPasswordAttemptCount, Int32& failedPasswordAnswerAttemptCount, Boolean& isApproved, DateTime& lastLoginDate, DateTime& 最后活动日期)在 System.Web.Security.SqlMembershipProvider.CheckPassword(字符串 用户名,字符串密码,布尔值 updateLastLoginActivityDate, Boolean failIfNotApproved, String& salt, Int32& passwordFormat) 在 System.Web.Security.SqlMembershipProvider.ValidateUser(字符串 用户名,字符串密码)在 WebMatrix.WebData.SimpleMembershipProvider.ValidateUser(字符串 用户名,字符串密码)在 USC.Controllers.AccountController.Login(LoginModel 模型,字符串 returnUrl) 在 D:\a\1\s\USC\Controllers\AccountController.cs:36 行 ClientConnectionId:b1f6b763-80f6-47f0-9a50-c70ab30635bd 错误 编号:18456,状态:1,等级:14

有什么想法吗???谢谢!

【问题讨论】:

连接字符串是使用服务器的 FQDN 还是 IP 地址?由于混合连接不能使用 UDP,因此您不能使用实例名称(需要访问 udp/1434 上的 SQL Browser 服务),所以您是否在连接字符串中指定端口号? 另外...请注意,您提供的链接中使用的 tcp/3306 端口用于 mysql 数据库连接。 Microsoft SQL Server 的默认端口(\MSSQLSERVER 实例名称)是 1433。 连接字符串本身适用于网站的其他访问。只有会员提供者失败 【参考方案1】:

消息“用户登录失败”是一条通用错误消息,可能有多种原因。出于安全原因,发送给客户端的错误消息不包含有关登录失败原因的信息。

您需要授予此用户登录 SQL Server 和访问数据库的权限:Create a Login - SQL Server

您要连接的数据库可能是在您部署应用程序时使用旧版本的 .NET Framework 的 aspnet regsql.exe 工具生成的。尝试使用您在本地创建和配置成员数据库时使用的相同版本的 aspnet regsql。也许您只是在本地使用了 SQL Express 和 /App Data 文件夹。

在两个数据库中,比较表结构。请比较 AspNet Membership 表。

你甚至可以参考:System.Data.SqlClient.SqlException:Login failed for user | The ASP.NET Forums

疑难解答:用户“x”登录失败 | Microsoft Docs

【讨论】:

以上是关于部署到 Azure 应用服务时,Asp.net 成员资格提供程序无法连接到本地 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

将 ASP.NET Core 6 应用部署到现有的 Azure 应用服务?

到 Azure ACI 的基本容器化 ASP.NET 3.1 Core 应用部署失败

从 GitHub 持续部署在 Azure 中失败(ASP.NET 5 和 MVC 6)

Azure WebApp Asp.NET Core 2 错误:启动应用程序时出错

将 ASP.NET 应用程序部署到 Azure Web 应用程序时出现 HTTP 403 错误

交换 Azure Web App 部署槽会注销 ASP.NET Core RC2 中的所有用户