gpt4 book ai didi

exception-handling - MVC5 AntiForgeryToken-如何处理“ “The provided anti-forgery token was meant for user ””,但当前用户为“xxx”。异常(exception)?

转载 作者:行者123 更新时间:2023-12-03 20:27:14 31 4
gpt4 key购买 nike

我想通过 AntiforgeryToken 属性来保护我们的登录操作-我知道为什么会发生该主题的异常,但是我似乎找不到任何好的解决方案。

假设我们有以下情况:

  • 现在是8:00 AM,应用程序用户开始工作,他们坐下并开始登录过程-现在非常有可能,其中一些用户将获得相同的 ValidationToken 。第一个登录后,其他所有尝试登录时都会看到上述异常(或其他自定义异常屏幕)。
  • 某些用户登录后,不小心按下了 back 按钮并尝试再次登录-虽然这种情况不太可能发生,但我不希望用户看到异常。

  • 因此,问题很简单- 如何防止上述情况,或如何处理这些情况,以便用户不会注意到。我尝试了以下方法:
  • 设置 AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; 中的。Global.asax中的Application_Start -不能解决问题,我仍然遇到相同的异常
  • 在方法上使用 [ValidateAntiForgeryToken]属性--,再次设置 [OutputCache(NoStore = true,Duration = 0,VaryByParam =“None”)]

    现在,我正在考虑手动验证操作正文中的 token ,捕获错误,并检查是否由匿名用户进行了尝试:
    public ActionResult SomeAction()
    {
    try
    {
    AntiForgery.Validate();
    }
    catch(HttpAntiForgeryException ex)
    {
    if(String.IsNullOrEmpty(HttpContext.User.Identity.Name))
    {
    throw;
    }
    }

    //Rest of action body here
    //..
    //..
    }

    上面的方法似乎可以防止错误-,但是安全吗? 有哪些替代方法?

    提前致谢。

    最好的祝福。

    编辑:

    最终的“解决方案”是禁用登录表单上的 token 验证-可能有更好的方法来处理它,但是看来我发现的所有解决方案都是类似于上面建议的丑陋的解决方法。

    由于没有办法知道这些替代方案的“安全性”(如果绝对安全),因此我们决定在登录时禁用 token 验证。

  • 最佳答案

    尝试设置(在global.cs中):

    AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

    这会将名称标识符添加到您的 token 中,

    至于两次登录问题,请尝试使用脚本记录原始提交的日期和时间,以停止使用相同 token 的第二次提交。
    // jQuery plugin to prevent double submission of forms
    jQuery.fn.preventDoubleSubmission = function() {
    $(this).on('submit',function(e){
    var $form = $(this);

    if ($form.data('submitted') === true) {
    // Previously submitted - don't submit again
    e.preventDefault();
    } else {
    // Mark it so that the next submit can be ignored
    $form.data('submitted', true);
    }
    });

    // Keep chainability
    return this;
    };

    所以我们知道一件事;用户喜欢后退按钮,并且习惯于双击,这是AntiforgeryToken的大问题。

    但是根据您的应用程序执行的操作,有一些方法可以限制其强制执行此操作。最简单的方法是尽力而为,使访问者不会觉得自己需要“倒带”更改请求。

    Ensure that form error messaging is clear and concise to ensure the user knows what is wrong. Contexual errors give bonus points.

    Always maintain form state between form submissions. Apart from passwords or credit card numbers, there’s no excuse thanks the to MVC form helpers. @Html.LabelFor(x => x.FirstName)

    If forms are spread across tabs or hidden divs such as those used in SPA frameworks like Angular or ember.js, be smart and show the controller layouts or form that the errors actually originated from in the form submission when displaying the error. Don’t just direct them to the home controller or first tab.



    “发生了什么事?” -随时通知用户

    当AntiForgeryToken无法验证时,您的网站将引发类型为System.Web.Mvc.HttpAntiForgeryException的异常。

    如果设置正确,则会打开友好错误,这意味着您的错误页面将不会显示“异常”,而会显示一个不错的错误页面,告诉您发生了什么情况。

    通过捕获HttpAntiForgeryException,至少为用户提供针对这些异常的信息量更大的页面,可以使此操作变得容易一些。
    private void Application_Error(object sender, EventArgs e)
    {
    Exception ex = Server.GetLastError();

    if (ex is HttpAntiForgeryException)
    {
    Response.Clear();
    Server.ClearError(); //make sure you log the exception first
    Response.Redirect("/error/antiforgery", true);
    }
    }

    并且您的 /error/antiforgery View 可以告诉他们 很抱歉,您尝试两次提交相同的信息

    另一个想法是记录错误,并使用户返回登录屏幕:

    创建一个覆盖OnException方法的 HandleAntiforgeryTokenErrorAttribute类。

    HandleAntiforgeryTokenErrorAttribute.cs:
    public class HandleAntiforgeryTokenErrorAttribute : HandleErrorAttribute
    {
    public override void OnException(ExceptionContext filterContext)
    {
    filterContext.ExceptionHandled = true;
    filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary(new { action = "Login", controller = "Account" }));
    }
    }

    全局过滤器:
    public class FilterConfig
    {
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
    filters.Add(new HandleErrorAttribute());
    filters.Add(new HandleAntiforgeryTokenErrorAttribute()
    { ExceptionType = typeof(HttpAntiForgeryException) }
    );
    }
    }

    我还将使用一些工具来记录您的所有信息,因为登录是应用程序的关键部分

    NLog 用于一般日志记录和有关关键应用程序异常(包括Web异常)的电子邮件。

    Elmah 用于过滤和发送Web异常。

    编辑:
    另外,您可能需要查看一个称为SafeForm的jQuery插件。 Link

    编辑:

    我已经看到有关此问题的辩论,每个人对该主题的观点都有正确的论点,我是怎么看的(摘自 owasp.org)

    Cross-Site Request Forgery (CSRF) is an attack that forces an end user to execute unwanted actions on a web application in which they're currently authenticated, CSRF attacks specifically target state-changing requests, not theft of data. The anti-forgery token is specific to 'who is logged on'. So once you login, then go back, the old token is no longer valid



    现在,如果用户的IP地址发生更改,我还将使用授权的IP地址以2因子授权登录到我的应用程序分配中,因此,如果正在执行跨站点请求伪造,则用户将无法匹配IP地址并请求2因子授权。几乎就像安全路由器的工作方式一样。但是,如果您希望将其保留在登录页面上,那么只要您设置了友好的错误页面,我就不会遇到任何问题,因为人们会看到他们做错了什么,因此他们不会感到沮丧。

    关于exception-handling - MVC5 AntiForgeryToken-如何处理“ “The provided anti-forgery token was meant for user ””,但当前用户为“xxx”。异常(exception)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32653049/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com