2008-09-19 139 views
1

我有兩個web應用程序,一個是簡單的authenticationsite,它可以驗證登錄用戶,然後將他重定向到另一個站點。在ASP.NET Web應用程序中隱藏查詢字符串

因此,我必須將其userId(GUID)傳遞給第二個應用程序。目前這是通過URL完成的,但我想隱藏這個ID。

有沒有人有一個想法如何正確地做到這一點?

[編輯]:我無法使用會話,因爲ApplicationBoundaries(2個不同的服務器)

回答

0

的通過會議,最好的方式傳遞的GUID。

http://www.w3schools.com/ASP/asp_sessions.asp

OR,因爲它是2臺不同的服務器上,由POST方法傳遞信息:

http://www.w3schools.com/aspnet/aspnet_forms.asp

另一種可能是會話狀態存儲在數據庫中在本地服務器上,並從其他服務器遠程訪問該數據庫,以查看用戶是否已成功登錄並在會話時間範圍內。

考慮到這一點,您也可以遠程執行整個身份驗證。從遠程服務器遠程連接到本地數據庫,並從那裏檢查登錄憑證......這樣您就可以將會話和/或cookie存儲在遠程服務器上。

我會建議反對隱藏的領域主張,因爲它完全抵消你正在嘗試做的事情!您正試圖隱藏URL中的GUID,但在HTML代碼中發佈相同的信息!這不是做到這一點的方法。

最好的選擇是數據庫選項,或者如果不可能的話,然後使用HTTP POST。

0

使用會話變量或HTTP POST代替HTTP GET。

0

如果服務器有一個公用域名,可以使用cookie。

編輯:餅乾將視覺隱藏ID,它仍然可以訪問。與隱藏字段相同或使用POST而不是GET。因此,如果ID是有把握的,並且您希望避免通過未加密的網絡將其發送到網絡上,則需要採用不同的方法。

解決方案可能是使用服務器共享的密鑰對auth服務器上的ID進行加密。另一種解決方案可能是在auth服務器上生成一個隨機的GUID,然後讓auth服務器直接通過其他服務器(通過SSL)通知與GUID對應的哪個ID。

0

而不是通過查詢字符串來傳遞它,你應該創建一個隱藏的表單字段的值,然後發佈到你的第二頁,然後可以獲取發佈的值,它將從用戶隱藏。

2

這聽起來像一個棘手的情況。 然而,您可以使用幾個選項,但這一切取決於您的應用程序的功能。

讓我們調用WebApp1您的驗證網站和WebApp2一旦驗證通過您的遠程站點。

WebApp2可以在幕後調用WebApp1嗎? (服務)

在應用程序之間傳遞Guid的問題是它通過明文顯示,並且考慮到它是用戶ID,如果有人設法攔截此應用程序,他們將終身訪問WebApp2。無論您是將查詢字符串還是表單變量傳遞給它,它仍然很脆弱。

如果您無法使用WebApp2查詢WebApp1,則應該考慮WebApp1創建一個到期的臨時Guid。從長遠來看,這會更安全一些,但由於明文仍然容易受到攻擊。這兩個Web應用程序還需要訪問相同的數據存儲。

最終,我認爲AUentication Site應該是WebApp2可以使用的服務。 用戶應該通過WebApp2登錄,WebApp2將安全地調用WebApp1進行認證。 WebApp2可以管理它自己的會話。

+0

問題是,實際的身份驗證是在WeppApp1中使用的完整的其他服務中完成的:所以我無法真正使用temp。 GUID是因爲他們正在接受另一個系統(這不在我的控制之下) – MADMap 2008-09-19 08:49:48

2

如果您不能使用cookie,因爲它是跨域的,請使用隨機數對其進行加密。

在兩臺服務器之間設置共享密鑰/密鑰;將加密的GUID和nonce組合發送到第二臺服務器。不加密,檢查nonce是否已被使用(停止回覆攻擊),然後使用未加密的GUID。

如果你想要更加棘手的話,在app1上有一個web服務,它可以檢查實際發佈的隨機數(此時你正朝着WSTrust和單點登錄解決方案前進,重新嘗試做)

即使使用cookie,由於它們很容易編輯/僞造,您應該進行某種形式的檢查。

2

您有兩個ASP.NET Web應用程序,一個應用程序只會對用戶進行身份驗證嗎?

這聽起來像一份工作....

Web服務!

在身份驗證應用程序(它們是.asmx擴展名)上創建一個新的Web服務,並添加一個接收用戶名和密碼等的單一方法,並返回身份驗證信息。

然後在您的第二個應用程序中導入WSDL,並像調用第一個應用程序一樣調用第一個應用程序。它會簡化你的代碼,並解決你的問題。

一個例子:

AuthenticateUserService.asmx那張身份驗證的應用程序:

using System; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class AuthenticateUserService : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public bool AuthenticateUser(string username, string passhash) 
    { 
     // Fake authentication for the example 
     return (username == "jon" && passhash == "SomeHashedValueOfFoobar"); 
    } 

} 

一旦被安裝,啓動你的主應用程序,右鍵單擊該項目,並單擊「添加Web引用」 。

在身份驗證應用程序中輸入asmx的url,Visual Studio會發現它並創建一個代理類。

一旦做到這一點,我們可以調用這個方法就像是在我們的主應用程序的本地方法:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Now we can easily authenticate user in our code 
    AuthenticateUserService authenticationProxy = 
     new AuthenticateUserService(); 
    bool isUserAuthenticated = 
     authenticationProxy.AuthenticateUser("jon", SomeHashMethod("foobar")); 
} 

那麼,這究竟怎麼辦?

它消除了客戶端的身份驗證過程。

  • APPB客戶重定向回APPA如果證書匹配

    • 客戶端進入憑據APPA
    • APPA重定向客戶APPB:

      您當前的進程。

    被替換爲AppA和AppB之間的服務器端SOAP調用。現在,它是這樣的:

    • 客戶端輸入憑據在APPA
    • APPA問APPB只要是好的
    • APPA提供適當的內容給客戶端。
  • 0

    去會話管理或使用HTTP帖子如上述帖子中所述。