c# - 部署到 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, TaskCompletionSource
1 次重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& 连接)在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource
1 次重试,DbConnectionOptions userOptions)在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1 次重试)在 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
有任何想法吗???谢谢!
解决方案
消息“用户登录失败”是可能有多种原因的一般错误消息。出于安全原因,发送给客户端的错误消息不包含有关登录失败原因的信息。
您需要授予此用户对 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”登录失败 | 微软文档
推荐阅读
- mysql - 如何每天获得最多 5 天的总计数值
- reactjs - React-Admin:如何在“创建”或“编辑”组件中获取自定义输入的值
- reactjs - Meteor + React + Semantic UI - 安装这个堆栈的最佳方式是什么?
- jenkins - 如何在 Jenkins 中查看谁修改了全局凭据
- aem - 在 Adobe AEM HTL(以前称为 Sightly)中实施自定义选项?
- matlab - 在 MatLab 中求解具有任意大小矩阵的线性方程组以进行有限差分计算
- c# - Dapper Execute 函数,可以调用 PostgreSQL 函数并返回受更新或插入影响的行
- facebook - Facebook Messenger 在有效消息请求中返回错误
- python - Django 将 Matlpotlib 图像作为变量传递
- android - 使用 RxJava 2 修改 UI 会出现异常:Animators 只能在 Looper 线程上运行