2016-06-23 45 views
0

我正在和我的窗戶形式的項目的問題。我有一個用戶更改SQL Server登錄密碼的功能。用戶將使用舊密碼在Windows窗體上進行登錄。導航到更改密碼功能後,系統會要求他們提供新密碼和舊密碼。新的和舊的密碼被接收,使用SQL命令來更改密碼強制用戶重新認證後,他們改變自己的登錄密碼

ALTER LOGIN [LOGIN_NAME] 
    WITH PASSWORD = 'NEW_PASS', OLD_PASSWORD = 'OLD_PASS'; 

但問題是,用戶還可在此會話中使用舊密碼和新密碼登錄到SQL Server。在我停止並再次開始項目之後,舊密碼已過期。我想在用戶提交新密碼時,應用程序必須再次強制其登錄。誰能給我解決方案?

非常感謝!

P/S:我想我應該多談談雙向用戶連接到數據庫。

我使用一個連接字符串是這樣的:

Program.connstr = "Data Source=" + Program.servername + ";Initial Catalog=" + Program.database + ";User ID=" + Program.mlogin + ";password=" + Program.password; 

用戶連接到與該數據庫的授權帳戶數據庫,並執行任務的必要。並且密碼的更改將更新連接字符串的密碼。

再次感謝!

回答

0

假設您創建的每個請求SQL數據庫的新連接(這是你應該如何其實也),你可以建立某種形式的SQL連接工廠,這將爲你的用戶的連接。當此工廠捕獲SQL異常(如login failed for user)時,請切換到Your password is expired窗口,然後再次詢問憑據。

public class SqlConnectionFactory 
{ 
    public static SqlConnection CreateConnection() 
    { 
     try 
     { 
      string connectionString = $"Data Source={Program.servername};Initial Catalog={Program.database};User ID={Program.mlogin};password={Program.password};"; 
      var connection = new SqlConnection(connectionString); 
      connection.Open(); 
      return connection; 
     } catch (SqlException se) when (se.Number == 18456) 
     { 
      MessageBox.Show("Your password is invalid. Try to login again."); 
      Environment.Exit(0); 
     } 
    } 
} 


// Everywhere in your code 
SqlConnectionFactory.CreateConnection(). 

也許,您需要一個比關閉應用程序更漂亮的方法,但這只是一個演示。
您也可以爲您創造SqlConnectionFactory一些方法,如ExecuteAndReturnReader,這將創建一個連接,創建一個命令,執行後返回它的讀者。

+0

感謝您的回答。顯然,我不想關閉應用程序了。我讀了這個鏈接:https://msdn.microsoft.com/en-us/library/ms189828.aspx 他們說:「對於性能方面的原因,當密碼SQL數據庫復位,連接不會被重新 - 認證,即使連接因連接池而重置「。所以我認爲問題是連接仍然是老信息。如果我可以強制它更新這個連接,我的問題可能會得到解決。 – NhanDT

相關問題