2009-12-11 50 views
12

我們有一個在IIS6上運行的ASP.Net Web應用程序,它管理自己的用戶數據庫。ASP.Net - 在沒有Windows用戶的情況下使用基本身份驗證

該網站本身只允許匿名訪問,所有的身份驗證/安全性使用我們的應用程序本身進行管理。

我們有一個頁面,其中包含一個HTML表格數據,我們將其導入到Excel中,然後用於報告目的。該頁面當前沒有安全實施。

我們需要爲此頁面添加安全性,以便在這些電子表格落入錯誤的手中時,如果不提供用戶名/密碼,數據將無法「刷新」。

如果我將此頁面設置爲不允許Anonymouse訪問,那麼我可以使用Windows用戶的基本/ Windows身份驗證來保護此頁面。然後,當Excel刷新數據時,彈出密碼對話框。

問題是我需要能夠基於我們的數據庫中的用戶來保護此頁面,並且他們不會是Windows用戶。我還需要這樣做,使Excel可以管理排除任何基於表單的身份驗證的身份驗證。

任何人有任何想法?是否有可能讓IIS查找其他地方的基本身份驗證?

回答

10

好的,所以我找到了兩個解決這個問題的方法。感謝Zhaph - Ben Duguid的答案,它是一個允許ASP.Net完全管理認證的HttpModule。

第二種解決方案和我正在使用的解決方案是感謝這個問題/答案。

HTTP Authentication (Basic or Digest) in ASP Classic via IIS

我已經剝離下來,有一個簡單的測試工具,這似乎運作良好。在這個例子中,代替數據庫調用,它只是檢查用戶名和密碼是否匹配並認爲已經過驗證。

using System; 
using System.Text; 

namespace AuthenticationTests 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      string authorisationHeader = Request.ServerVariables["HTTP_AUTHORIZATION"]; 

      if (authorisationHeader != null && authorisationHeader.StartsWith("Basic ", StringComparison.InvariantCultureIgnoreCase)) 
      { 
       string authorizationParameters = Encoding.Default.GetString(Convert.FromBase64String(authorisationHeader.Substring("Basic ".Length))); 
       string userName = authorizationParameters.Split(':')[0]; 
       string password = authorizationParameters.Split(':')[1]; 

       if (userName == password) //Perform your actual "login" check here. 
       { 
        //Authorised! 
        //Page loads as normal. 
       } 
       else 
       { 
        Unauthorised(); 
       } 
      } 
      else 
      { 
       Unauthorised(); 
      } 
     } 

     private void Unauthorised() 
     { 
      Response.AddHeader("WWW-Authenticate", "Basic"); 
      Response.Status = "401 Unauthorized"; 
      Response.End(); 
     } 
    } 
} 
+0

這是否會危及安全? – Joyce 2015-03-20 12:36:54

1

我不是專家,但我認爲基本點是它是Windows身份驗證。你能運行一個腳本來同步你的數據庫用戶和Active Directory嗎?

如果是公司AD,您可以考慮爲您的應用程序準備第二個AD並同步來自您的公司AD和您的數據庫的用戶。如果您不需要同步密碼(例如,在您的站點中構建pwd-mgmt頁面),則可以使用腳本或C#或其他東西。如果您想要內置密碼同步更復雜的東西,您可以查看ILM 2007(即將成爲FIM 2010)。

+0

這樣做的問題是,我沒有辦法知道什麼任何現有的用戶密碼都是。他們都被鹽漬和散列等 – 2009-12-11 11:46:51

+0

如果你把你的同步方法(在後臺),然後到期的所有密碼,以便用戶必須設置新的? – serialhobbyist 2009-12-12 13:17:52

1

頁面是.html文件還是.aspx文件? 如果它是一個.aspx,你應該保持匿名訪問該頁面,並在頁面邏輯本身檢查認證

+0

這是一個ASPX頁面,所以我可以編寫它所需的任何.net/c#代碼。但是,是否有可能以匿名方式通過IIS,然後仍然執行自定義HTTP身份驗證樣式身份驗證?你有這樣的例子嗎? – 2009-12-11 11:51:49

+0

我不確定我瞭解你的問題。你說過「所有認證/安全性都是使用我們的應用程序本身來管理的。所以我假設用戶登錄後會有一個Session變量被啓動,對吧? 在頁面頂部檢查變量,如果沒有設置,重定向到「login.aspx」 – SergeyKazachenko 2009-12-11 14:46:48

+1

該頁面被Excel訪問... Excel不知道如何處理重定向到Login.aspx的頁面。 – 2009-12-11 15:40:04

6

正如你已經有了用戶的自定義數據庫,我建議你在尋找建立快速membership provider那與您的數據庫模式交談。

MSDN在"How to: Sample Membership Provider"上有一個很好的例子。

然後,您可以使用standard access control mechanisms of ASP.NET來鎖定頁面,需要認證等,與對照一起像LoginLoginStatus和其他人提供多少你需要的用戶界面。


編輯補充

快速search發現以下,這威力幫助:

Web Service Security - Basic HTTP Authentication without Active Directory

當格雷格Reinacker提出了「一個完全工作樣品在100%米這些代碼演示了使用HTTP基本認證,使用單獨的憑證存儲(在這種情況下,這是一個XML文件,雖然這將很容易更改爲數據庫或LDAP存儲)。「

+0

我可能在這裏是錯誤的,但是這不會依賴於Forms風格的身份驗證,例如,在返回到原始頁面之前請求頁面首先將用戶帶到登錄頁面。問題是,這是不可能從Excel這就是爲什麼我需要它使用HTTP身份驗證,例如,基本身份驗證。 – 2009-12-11 12:03:10

+0

啊,我明白你的意思了,但是你沒有被windows用戶卡住 - 這正如serialhobbyist指出的那樣,Basic Auth使用什麼。 – 2009-12-11 12:17:51

+0

我見過一些HttpModule的可能用途來實現IIS以外的基本身份驗證。如果我有任何成功,我會在這裏發佈。 – 2009-12-11 12:24:19

1

我寫了一個名爲FSCAuth的庫,可能對此有所幫助。它可以簡單地設置爲無需Active Directory的基本身份驗證。這反而讀取用戶數據從數據庫/文件/地方(甚至還有一個內存僅UserStore)

這是BSD許可at Binpress

相關問題