2014-09-04 302 views
0

我運行一個使用表單身份驗證的ASP.NET網站。事實上,用戶不必輸入任何內容 - 我用Request.ServerVariables["LOGON_USER"]並在某個SQL數據庫中使用自定義類EmployeeInfo查找了此用戶名,然後根據結果將用戶重定向到默認頁或顯示不同消息的錯誤頁對錯誤的類型:Windows身份驗證自定義驗證(來自數據庫)

Web.config文件:

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx"/> 
</authentication> 
<authorization> 
    <deny users="?"/> 
</authorization> 

的Login.aspx:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!this.IsPostBack) 
    { 
     FormsAuthentication.SignOut(); 
     string UserName = Request.ServerVariables["LOGON_USER"]; 
     EmployeeInfo CurrentEmployee = EmployeeInfo.RequestDBInfo(UserName); // SQL magic here 
     if (CurrentEmployee = null) 
      Response.Redirect("AccessDenied.aspx?Message=NoInfo"); 
     else 
      if (CurrentEmployee.Suspended = true) 
       Response.Redirect("AccessDenied.aspx?Message=Suspended"); 
       if (CurrentEmployee.Expired = true) 
        Response.Redirect("AccessDenied.aspx?Message=Expired"); 
        if (CurrentEmployee.Position = null) 
         Response.Redirect("AccessDenied.aspx?Message=NoPosition"); 
        else 
         FormsAuthentication.RedirectFromLoginPage(CurrentUserName, true); 
    } 
} 

這是工作好直到最近,我們不得不切換到Windows身份驗證SE好奇的原因。現在,如果用戶無效,我的網站默認會打開Login.aspx頁面,並將用戶重定向到相應的錯誤頁面。但是用戶只需輸入URL即可打開任何頁面,因爲當然不會執行表單身份驗證,並且用戶可以通過Windows驗證身份。

所以我的問題是:

什麼是在Windows上實現身份驗證的頂部通過數據庫附加檢查的最佳實踐?據我所知,我需要改變Application_AuthenticateRequestGlobal.asax

回答

0

從給出的信息來看,tt聽起來像你使用了IIS,啓用了「集成Windows身份驗證」功能,在設置中禁用了「允許匿名」。您網站上的所有用戶都可以在他們的網絡瀏覽器和服務器(以及底層網絡基礎架構)之間進行身份驗證。通過身份驗證後,IIS正在檢查網站資源文件上的ACL,以確保它們有權(甚至通過NTFS)請求該文件,並且顯然這已正確設置,以便允許請求訪問您的ASP.Net代碼。好的,現在你已經達到了你的代碼,讓我們從一些策略開始吧:

你提到了Application_AuthenticateRequest。這是一個很好的方法,因爲在請求者通過配置的安全設置(IIS首先,然後在您的web.config包含的自定義模塊中設置的任何設置)進行身份驗證之後,這給您一個編寫自定義安全代碼的注入點。另外,您可以在這一節中編寫安全代碼,並且它會針對您網站上的每個頁面執行。當您爲此方法編寫代碼時,可以通過檢查HttpContext.Current.User不爲空來驗證當前用戶是否已通過驗證,並且該HttpContext.Current.User.IsAuthenticatedtrue。您可以像使用Request.ServerVariables [「LOGON_USER」]那樣從User屬性中獲取用戶的網絡ID。一旦擁有該ID,就可以進行數據庫查詢,然後根據情況進行重定向。

出於性能方面的考慮,如果您的安全模型允許,則可能需要緩存此信息。例如,一個簡單的方法是在Session中存儲具有權限的安全對象。那麼你可以先檢查一下,如果用戶還沒有經過驗證的會話,那麼執行數據庫查找等。