移动数据库和网站后登录失败

Login Fail after moving database and website

我正在将网站和数据库从 azure 迁移到本地服务器 (sql server 2008 r2)。 我成功地复制了数据库并在 IIS 中设置了网站。我可以正常导航到该网站,但它无法登录。

我的堆栈跟踪

Message: A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - The target principal name is incorrect.)

堆栈跟踪:在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常、Boolean breakConnection、Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParserStateObject.SNIWritePacket(SNIHandle handle, SNIPacket packet, UInt32& sniError, Boolean canAccumulate, Boolean callerHasConnectionLock) at System.Data.SqlClient.TdsParserStateObject.WriteSni(Boolean canAccumulate) at System.Data.SqlClient.TdsParserStateObject.WritePacket(Byte flushMode, Boolean canAccumulate) at System.Data.SqlClient.TdsParser.TdsLogin(SqlLogin rec) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 重试、DbConnectionOptions userOptions、DbConnectionInternal& 连接) 在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions) 在 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 重试) 在 System.Data.SqlClient.SqlConnection.Open() 在 System.Web.DataAccess.SqlConnectionHolder.Open(HttpContext 上下文,布尔 revertImpersonate) 在 System.Web.DataAccess.SqlConnectionHelper.GetConnection(字符串 connectionString,布尔 revertImpersonation) 在 System.Web.Security.SqlMembershipProvider.GetPasswordWithFormat(字符串用户名、布尔值 updateLastLoginActivityDate、Int32 和状态、字符串和密码、Int32 和密码格式、字符串和密码盐、Int32 和 failedPasswordAttemptCount、Int32 和 failedPasswordAnswerAttemptCount、布尔值和 isApproved、DateTime 和 lastLoginDate、DateTime 和 lastActivityDate) 在 System.Web.Security.SqlMembershipProvider.CheckPassword(字符串用户名、字符串密码、布尔值 updateLastLoginActivityDate、布尔值 failIfNotApproved、字符串和盐、Int32 和密码格式) 在 System.Web.Security.SqlMembershipProvider.ValidateUser(字符串用户名,字符串密码) 在 EbpWebSite.Account.login.Page_PreLoad(对象发送者,EventArgs e) 在 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)

我错过了什么吗?此举是否搞砸了登录的密码盐?我的登录表是标准 aspnet_Membership、角色、用户设置。我刚刚从 Azure 复制到本地数据库。第一行表明,我已正确更新连接字符串。

按照建议添加 connectionString

<add name="EbpCloud" connectionString="Server=EBP-OCON-SQL1;User ID=dbread22;Password=*****;Trusted_Connection=True;Encrypt=True;Connect Timeout=0;Database=EbpReporting;" />

原来的字符串是Server=tcp:server.database.windows.net

该网站本地驻留在与数据库相同的服务器上。 (我需要将本地作为服务器名称的一部分吗?) 我的登录码:

      if (Membership.ValidateUser(userName, passWord)) {
    FormsAuthentication.Initialize();
    FormsAuthentication.SetAuthCookie(userName, false);
    using (var conn = Utilities.SqlConnectionEbp(Utilities.DatabaseEbp.EbpReporting)) {
      // call stored procedure to get the user default session settings
      using (var cmd = new SqlCommand("aspnet_UserDefaultSessionSettings", conn)) {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@UserName", userName));
        // Check Sql State and open connection
        if (!conn.State.Equals(ConnectionState.Open))
          conn.Open();
        using (var reader = cmd.ExecuteReader()) {
          while (reader.Read()) {
            Session["userName"] = userName;
            Session["forceResetPassword"] = passWord.Equals("p@ssw0rd");
            Session["displayName"] = reader["displayName"].ToString();
            Session["instanceId"] = Convert.ToInt16(reader["instanceId"]);
            Session["userEmail"] = reader["email"].ToString();
            Session["userId"] = new Guid(reader["UserId"].ToString());
            //Session["clinicList"] = Utilities.GetClinicList();
          }
        }
      }
    }
    Response.Redirect("/administration/supplierinvoice.aspx", false);
  }

调用的实用程序class:

      public static class Utilities
  {
    public enum DatabaseEbp
    {
      Ebp, EbpReporting, Master, ebpCIS
    }
    /// <summary>
    /// SqlConnectionEBP - EBP Connection object
    /// </summary>
    /// <returns>SqlConnection</returns>
    public static SqlConnection SqlConnectionEbp(DatabaseEbp database) {
      var connString = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["EbpCloud"].ToString());
      connString.InitialCatalog = database.ToString();
      var conn = new SqlConnection(connString.ToString());
      return conn;
    }

您能否从 web.config 文件中发布您的 connectionStrings 标记,以及您的 code_behind(您连接的位置到数据库)?我从未尝试过使用标准身份验证,但我怀疑它使用了一些面向服务器的功能(正如你所说的,在你迁移到 azure server 后已经显示错误)

有时候是简单的事情。该网站和数据库都位于同一台物理服务器上,因此将 connectionstring 更改为

  <add name="EbpCloud" connectionString="Data Source=localhost;Initial Catalog=ebpreporting;Persist Security Info=True;User ID=dbread22;Password=*****" providerName="System.Data.SqlClient" />

成功了。