2011-06-20 109 views
4

我正在爲我的頁面使用jQuery Cookie執行C#授權。我在Cookie中和我的管理頁面中設置/加密用戶名和密碼,如果我識別cookie,則授權用戶。如果沒有,他會被重定向到登錄頁面。問題在於,Cookie在加載頁面後被讀取,所以我可以手動點擊管理頁面,僅在幾秒鐘內它就會被重定向。我如何防止爲訪問者加載管理頁面,他們沒有cookie?什麼是基於cookie的授權的正確架構?C#基於cookie的授權

注意:我沒有使用ASP.NET角色或用戶表。我爲用戶實現了我自己的表格。

回答

3

我懷疑你是在重新發明輪子。您不必使用成員資格提供程序和ASP.Net成員資格模式來利用表單身份驗證。當用戶登錄時,只需將Auth Ticket(cookie)放在他們身上,就完成了。然後你可以簡單地在管理頁面上進行管理檢查。

以下幾點建議......

編輯:我最初發布通過的UserData存儲在驗證票作用的一種手段,但我認爲這是矯枉過正這種情況。

Web.config文件:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogOn" timeout="30" slidingExpiration="true" /> 
</authentication> 
. . . 
<membership> 
    <providers> 
    <clear /> 
    </providers> 
</membership> 

登錄後: 當用戶提交的用戶名和密碼,驗證和檢查,看看他們是否有一個管理員:

if (UserIsValid(username, pwd)) // some validation call 
{ 
    FormsAuthentication.SetAuthCookie(username, true); 
} 

Admin.aspx: 最後,快速入侵以限制訪問管理頁面。當頁面加載時,檢查用戶是否是管理員:

if (!IsAdmin(User.Identity.Name)) // some admin call 
    Response.Redirect("Default.aspx"); 
+0

所以糾正我,如果我錯了:在這裏我們從代碼中設置cookie,這將保護我形成用戶禁用js的情況。對?否則,我仍然可以使用jQuery設置cookie,並在後面的代碼中讀取它們。但是在這種情況下,我會忽略沒有js的用戶 –

+1

從客戶端設置auth cookie是不安全的。你不能加密它,因此可能被欺騙。除非你正在將某種AJAX帖子發回服務器,然後將加密的響應作爲cookie放棄?主要的一點是cookie的有效載荷需要被服務器加密,或者任何人都可以模擬一個用戶。 – Brett

+0

@Stewie Griffin:我簡化了場景。將數據存儲在UserData中對於這種情況可能是過度的。 – Brett

1

問題是,您使用客戶端代碼進行安全檢查。如果有人會完全禁用JavaScript,他將永遠不會被重定向。將支票移動到您的服務器端代碼。

+0

你說,我不應該使用cookie來解析用戶?如果是這樣,我應該使用什麼?會議? –

+0

基本上,是的:使用會話來存儲登錄標誌並將會話ID作爲cookie發送給用戶(大多數框架都會爲你做這些,這是使用會話的一大優勢:-))。 – nfechner

+0

你的回答是正確的,但是我想用cookies來實現它。另外,如果用戶禁用JavaScript,則整個網站(以及互聯網上所有其他90%的網站)都不起作用。 –