2008-10-21 20 views
1

這似乎是一個非常愚蠢的問題,但我試圖找出最好的方法來做到這一點。你會簡單地重定向到/ Logout頁面並讓控制器調用FormsAuthentication.SignOut函數嗎?如何使用ASP.NET MVC實現「註銷」鏈接?

這是我的第一個想法,但後來我想知道它是否會被第三方網站濫用。假設有人決定發佈一個鏈接到你的/ Logout頁面。用戶將退出您的應用程序。有沒有一種好方法來防止這種情況發生?

回答

0

您應該查找一個cookie或將客戶端標識爲真實用戶的東西。

+0

這會有幫助嗎?用戶在點擊鏈接時仍然會被註銷。 – 2008-10-21 00:22:59

+0

使用任何語言構建的任何Web應用程序都不存在此問題,其中註銷涉及到某種註銷頁面?您可以檢查推薦人並確保用戶來自同一個域,但這並不總是可靠的。 – Mun 2008-10-21 00:27:02

3

這就是我使用的。

public ActionResult Logout() 
{ 
    FormsAuthentication.SignOut(); 
    return RedirectToAction("Index", "Home"); 
} 

似乎工作正常。

第三方網站只會自行註銷。所以他們不會實現與實際點擊註銷不同的任何事情。

+0

因此,假設您的應用位於http://url.com,您的註銷頁面爲http://url.com/logout。如果第三方網站發佈了http:// url的鏈接。com/logout,任何登錄到你的應用程序,點擊該鏈接的用戶都將自行登出,對吧? – 2008-10-21 00:27:36

+0

你可以檢查它是否是MVC中的回傳嗎?如果是這樣,那麼註銷,否則只是重定向到索引視圖? – Mark 2008-10-21 00:30:50

4

如果您擔心用戶通過使用惡意鏈接意外退出應用程序,您可以檢查Referrer以確保註銷來自您的站點(或者在用戶只需輸入URL)。

我其實並不擔心這一點,因爲記錄某人很煩人,但不一定是安全風險。

5

這樣的惡意鏈接將成爲一類稱爲跨站點請求僞造CSRF的安全漏洞的一個例子。註銷鏈接相對無害,但遠程站點可能會設置一些隱藏表單並將它們發佈到您的站點以通過POST執行任何可能的操作。

最常見的對策是在每個表單中包含挑戰,隨機隱藏值,然後檢查該值。檢查referer頭部可以工作,但請注意,有些瀏覽器根本不會發送referer。

瞭解更多:http://en.wikipedia.org/wiki/Cross-site_request_forgery

2

新的ASP.net MVC的測試包含的AccountController,這可能是值得考慮的,因爲它本質上實現了從註冊登錄/退出到忘記密碼的功能。不知道它有多好,但肯定是一個很好的起點。

1

派生從的ActionResult

public class LogoutResult : ActionResult 
{ 
    private readonly IAuthenticationService _authenticationService; 
    private readonly IWebContext _context; 

    public LogoutResult(IAuthenticationService authenticationService, IWebContext context) 
    { 
     _authenticationService = authenticationService; 
     _context = context; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     _authenticationService.Logout(); 
     _context.Abandon(); 
     _context.Redirect("~/"); 
    } 
} 
1

這是一個老問題,但這裏是一個現代的例子與MVC:

[Authorize] 
public RedirectResult Logout() 
{ 
    FormsAuthentication.SignOut(); 

    return this.Redirect("/"); 
} 

可以確保Logout動作只能由被稱爲通過應用Authorize屬性登錄的人。