如何使用ASP.NET MVC实现“注销”链接?

时间:2008-10-21 00:18:27

标签: asp.net-mvc forms-authentication

这似乎是一个非常愚蠢的问题,但我正试图找出最好的方法来做到这一点。您是否只需重定向到/ Logout页面并让控制器调用FormsAuthentication.SignOut函数?

这是我的第一个想法,但后来我想知道它是否可能被第三方网站滥用。假设有人决定发布您的/ Logout页面的链接。用户将退出您的应用程序。有没有好办法防止这种情况?

7 个答案:

答案 0 :(得分:5)

这种恶意链接将是一类安全漏洞的示例,称为跨站点请求伪造,CSRF。注销链接相对无害,但远程站点可以设置一些隐藏的表单并将它们发布到您的站点以通过POST执行任何可能的操作。

最常见的对策是在每种形式中包含挑战,随机隐藏值,然后检查该值。检查引用标头可能有效,但请注意,某些浏览器根本不发送引用。

了解详情:http://en.wikipedia.org/wiki/Cross-site_request_forgery

答案 1 :(得分:4)

如果您担心用户通过使用恶意链接意外退出您的应用程序,您可以检查Referrer以确保注销来自您的站点(或者如果用户只需键入URL中的URL。

我实际上并不担心这个问题,因为将某人赶出去是令人讨厌的,但不一定是安全风险。

答案 2 :(得分:3)

这就是我使用的。

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

似乎工作正常。

第三方网站只会自行登出。因此,他们不会实现与实际点击退出有任何不同。

答案 3 :(得分:2)

新的ASP.net MVC Beta包含一个可能值得关注的AccountController,因为它实际上实现了从注册到登录/注销到忘记密码功能的所有功能。不确定它有多好,但肯定是一个很好的起点。

答案 4 :(得分: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("~/");
    }
}

答案 5 :(得分:1)

这是一个老问题,但这是一个MVC的现代例子:

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

    return this.Redirect("/");
}

您可以确保只有通过对其应用Logout属性登录的人才能调用Authorize操作。

答案 6 :(得分:0)

您应该查找cookie或将客户端标识为真实用户的内容。