这似乎是一个非常愚蠢的问题,但我试图找出最好的方法来做到这一点。您是否只需重定向到 /Logout 页面并让控制器调用 FormsAuthentication.SignOut 函数?
这是我的第一个想法,但后来我想知道它是否会被第三方网站滥用。假设某人刚刚决定发布指向您的 /Logout 页面的链接。用户将退出您的应用程序。有什么好的方法可以防止吗?
这似乎是一个非常愚蠢的问题,但我试图找出最好的方法来做到这一点。您是否只需重定向到 /Logout 页面并让控制器调用 FormsAuthentication.SignOut 函数?
这是我的第一个想法,但后来我想知道它是否会被第三方网站滥用。假设某人刚刚决定发布指向您的 /Logout 页面的链接。用户将退出您的应用程序。有什么好的方法可以防止吗?
这种恶意链接将是被称为跨站请求伪造、CSRF 的一类安全漏洞的一个示例。注销链接相对无害,但远程站点可以设置许多隐藏表单并将它们发布到您的站点以通过 POST 执行任何可能的操作。
最常见的对策是在每个表单中包含一个挑战、一个随机隐藏值,然后检查该值。检查referer 标头可能有效,但请注意,某些浏览器根本不发送referer。
阅读更多:http ://en.wikipedia.org/wiki/Cross-site_request_forgery
如果您担心用户通过使用恶意链接意外退出您的应用程序,您可以检查推荐人以确保注销来自您的站点(或者在用户简单键入的情况下为 NULL中的网址)。
我实际上并不担心这一点,因为注销某人很烦人,但不一定有安全风险。
这就是我使用的。
public ActionResult Logout()
{
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home");
}
似乎工作正常。
第三方网站只会自行注销。因此,他们不会获得与实际单击注销不同的任何结果。
新的 ASP.net MVC Beta 包含一个 AccountController,可能值得一看,因为它基本上实现了从注册到登录/注销到忘记密码功能的所有内容。不确定它有多好,但肯定是一个很好的起点。
这是一个老问题,但这里有一个 MVC 的现代示例:
[Authorize]
public RedirectResult Logout()
{
FormsAuthentication.SignOut();
return this.Redirect("/");
}
您可以通过将属性应用于该操作来确保该Logout
操作只能由登录的人调用。Authorize
派生自 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("~/");
}
}
您应该寻找 cookie 或将客户端标识为真正用户的东西。