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

问题描述

我正在尝试将我的 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):用户“OSUser”登录失败。在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity 身份,SqlConnectionString connectionOptions,SqlCredential 凭据,对象 providerInfo,字符串 newPassword,SecureString newSecurePassword,布尔重定向用户实例,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,DbConnectionPool 池,字符串 accessToken,布尔 applyTransientFaultHandling,SqlAuthenticationProviderManager sqlAuthProviderManager ) 在 System.Data.ProviderBase.DbConnectionFactory 的 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)。1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 次重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& 连接)在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource 1 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.Web.DataAccess.SqlConnectionHolder.Open(HttpContext context, Boolean revertImpersonate) 在 System.Web.DataAccess.SqlConnectionHelper.GetConnection(String connectionString, Boolean revertImpersonation) 在 System.Data.SqlClient.SqlConnection.Open() 在System.Web.Security.SqlMembershipProvider.GetPasswordWithFormat(String username, Boolean updateLastLoginActivityDate, Int32& status, String& password, Int32& passwordFormat, String& passwordSalt, Int32& failedPasswordAttemptCount, Int32& failedPasswordAnswerAttemptCount, Boolean& isApproved, DateTime& lastLoginDate, DateTime& lastActivityDate) 在 System.Web.Security。 SqlMembershipProvider.CheckPassword(字符串用户名,字符串密码,布尔值 updateLastLoginActivityDate,布尔值 failIfNotApproved,字符串&盐,Int32&passwordFormat) 在 System.Web.Security.SqlMembershipProvider.ValidateUser(String username, String password) 在 WebMatrix.WebData.SimpleMembershipProvider.ValidateUser(String username, String password) 在 USC.Controllers.AccountController.Login(LoginModel model, String returnUrl) 在D:\a\1\s\USC\Controllers\AccountController.cs:line 36 ClientConnectionId:b1f6b763-80f6-47f0-9a50-c70ab30635bd 错误编号:18456,状态:1,类:14

有任何想法吗???谢谢!

标签: c#asp.netsql-serverasp.net-mvcazure-web-app-service

解决方案


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

您需要授予此用户对 SQL Server 的登录权限和对数据库的访问权限:创建登录 - SQL Server

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

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

您甚至可以参考: System.Data.SqlClient.SqlException: Login failed for user | ASP.NET 论坛

疑难解答:用户“x”登录失败 | 微软文档


推荐阅读