1

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

这是我的第一个想法,但后来我想知道它是否会被第三方网站滥用。假设某人刚刚决定发布指向您的 /Logout 页面的链接。用户将退出您的应用程序。有什么好的方法可以防止吗?

4

7 回答 7

5

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

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

阅读更多:http ://en.wikipedia.org/wiki/Cross-site_request_forgery

于 2008-10-21T00:59:49.043 回答
4

如果您担心用户通过使用恶意链接意外退出您的应用程序,您可以检查推荐人以确保注销来自您的站点(或者在用户简单键入的情况下为 NULL中的网址)。

我实际上并不担心这一点,因为注销某人很烦人,但不一定有安全风险。

于 2008-10-21T00:36:45.610 回答
3

这就是我使用的。

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

似乎工作正常。

第三方网站只会自行注销。因此,他们不会获得与实际单击注销不同的任何结果。

于 2008-10-21T00:24:27.757 回答
2

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

于 2008-10-21T01:01:48.540 回答
2

这是一个老问题,但这里有一个 MVC 的现代示例:

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

    return this.Redirect("/");
}

您可以通过将属性应用于该操作来确保该Logout操作只能由登录的人调用。Authorize

于 2014-05-13T07:11:43.957 回答
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("~/");
    }
}
于 2008-10-21T03:20:26.997 回答
0

您应该寻找 cookie 或将客户端标识为真正用户的东西。

于 2008-10-21T00:20:43.180 回答