AMcoder - javascript, python, java, html, php, sql

MVC 4 հավելվածում HttpAntiForgeryException-ի ճիշտ մշակման եղանակ

Ահա սցենարը.

Ես ունեմ մուտքի էջ, երբ օգտվողը ստորագրում է այն, այն վերահղվում է դեպի հիմնական հավելվածի էջ: Այնուհետև օգտագործողը օգտագործում է դիտարկիչի հետ կոճակը, և այժմ նա մուտքի էջում է: Նա նորից փորձում է մուտք գործել, բայց հիմա բացառություն է արվում.

HttpAntiForgeryException (0x80004005). Տրամադրված կեղծիքների դեմ նշանը նախատեսված էր «» օգտագործողի համար, սակայն ներկայիս օգտվողը «userName» է:

Ես գիտեմ, որ սա կապված է քեշավորման հետ: Ես անջատել եմ բրաուզերի քեշավորումը մուտքի գործողության համար՝ օգտագործելով սովորական NoCache ֆիլտրը, որը սահմանում է բոլոր պահանջվող վերնագրերը՝ no-cache, no-store, must-revalidate և այլն:

  • սա չի աշխատում բոլոր բրաուզերների վրա
  • հատկապես Safari-ն (շատ դեպքերում բջջային) բացարձակապես անտեսում է նման կարգավորումները

Ես կփորձեմ հաքերներ անել և ստիպել Safari Mobile-ին թարմացնել, բայց դա այն չէ, ինչ ես սպասում եմ:

Ես կցանկանայի իմանալ, թե արդյոք կարող եմ.

  • կարգավորել բացառությունը՝ չցուցադրելով օգտատիրոջը որևէ խնդիր (օգտագործողի համար լիովին թափանցիկ)
  • կանխեք այս խնդիրը՝ փոխարինելով հակակեղծված նշանի օգտատիրոջ անունը, որը թույլ կտա օգտվողին նորից մուտք գործել առանց այս բացառության, եթե բրաուզերի քեշավորման հետ կապված իմ հաքերները դադարեցնեն աշխատել բրաուզերների հաջորդ տարբերակներում:
  • Ես իսկապես կցանկանայի չհիմնվել բրաուզերի վարքագծի վրա, քանի որ յուրաքանչյուրն իրեն այլ կերպ է պահում:

ԹԱՐՄԱՑՆԵԼ 1

Որոշ պարզաբանումներ անելու համար ես գիտեմ, թե ինչպես վարվել MVC-ում սխալների հետ: Խնդիրն այն է, որ սխալների հետ վարվելը բացարձակապես չի լուծում իմ խնդիրը: Սխալների հետ կապված հիմնական գաղափարը վերահղում է դեպի հարմարեցված սխալի էջ՝ գեղեցիկ հաղորդագրությամբ: Բայց ես ուզում եմ կանխել այս սխալը, այլ ոչ թե կառավարել այն օգտագործողի տեսանելի ձևով: Բռնակ ասելով նկատի ունեմ catch make username-ը փոխարինել կամ այլ հարմար գործողություն, ապա շարունակել մուտքը:

ԹԱՐՄԱՑՆԵԼ 2

Ես ներքևում ավելացրել եմ լուծում, որն աշխատում է ինձ համար:


  • Ես լիովին համաձայն եմ ձեր պարզաբանման հետ: Թարմացրեք ձեր հարցին և ձեր պատասխանին: Login-Logic-ը չպետք է հիմնվի դատարկ փորձարկումների, սխալների էջերի վերահղումների, էջը վերաբեռնելու վրա (օգտագործողին նորից մուտք գործելու խնդրանքով - իր հավատարմագրերը մուտքագրելուց անմիջապես հետո հետ) կամ կոտրելու համար: երբ մուտք եք գործել որպես այլ օգտվող (մինչ մեկ այլ օգտվող դեռևս մուտք է գործում): 06.08.2021

Պատասխանները:


1

Որոշ ժամանակ ուսումնասիրելուց հետո ես կարծում եմ, որ ես գտա ինչ-որ միջոց, թե ինչպես ազատվել այս սխալից օգտվողի համար: Դա կատարյալ չէ, բայց առնվազն չի ցուցադրում սխալի էջը.

Ես ստեղծել եմ զտիչ HandleErrorAttribute-ի հիման վրա.

    [SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", 
        Justification = "This attribute is AllowMultiple = true and users might want to override behavior.")]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class LoginAntiforgeryHandleErrorAttribute : FilterAttribute, IExceptionFilter
    {
        #region Implemented Interfaces

        #region IExceptionFilter

        /// <summary>
        /// </summary>
        /// <param name="filterContext">
        /// The filter context.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// </exception>
        public virtual void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.IsChildAction)
            {
                return;
            }

            // If custom errors are disabled, we need to let the normal ASP.NET exception handler
            // execute so that the user can see useful debugging information.
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }

            Exception exception = filterContext.Exception;

            // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
            // ignore it.
            if (new HttpException(null, exception).GetHttpCode() != 500)
            {
                return;
            }

            // check if antiforgery
            if (!(exception is HttpAntiForgeryException))
            {
                return;
            }

            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                {
                    { "action", "Index" }, 
                    { "controller", "Home" }
                });

            filterContext.ExceptionHandled = true;
        }

        #endregion

        #endregion
    }

Այնուհետև ես կիրառեցի այս զտիչը Login POST գործողության համար.

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
[LoginAntiforgeryHandleError]
public ActionResult Login(Login model, string returnUrl)
{

Այս լուծման հիմնական գաղափարը հակակեղծարարության բացառությունը վերահղելն է հիմնական ցուցանիշի գործողությանը: Եթե ​​օգտատերը դեռ չի նույնականացվի, ապա այն կցուցադրի մուտք էջը, եթե օգտատերը արդեն իսկ վավերացված է, այն ցույց կտա ինդեքս էջը:

ԹԱՐՄԱՑՆԵԼ 1 Այս լուծման հետ կապված մեկ հնարավոր խնդիր կա: Եթե ​​ինչ-որ մեկը մուտք է գործում տարբեր հավատարմագրերով, ապա սխալի դեպքում այն ​​պետք է ավելացվի լրացուցիչ մուտքի գործարկման ժամանակ՝ դուրս գալ նախորդ օգտվողից և մուտք գործել նորը: Այս սցենարը չի մշակվում:

10.09.2013
  • սա ինձ համար հիանալի աշխատեց: Ինձ դա պետք չէ ինչ-որ երևակայություն անելու համար: Պարզապես մի գցեք դեղին էկրանը: 03.03.2015

  • 2

    Եթե ​​դուք ունեք միայն մեկ կամ մի քանի գործառույթ ազդել, զտիչ ստեղծելը կարող է թեթևակի տեխնիկական գերխնդիր լինել: Ավելի պարզ, բայց ոչ ընդհանուր լուծում է պարզապես հեռացնել [ValidateAntiForgeryToken]-ը կոնկրետ մեթոդի համար և ավելացնել ձեռքով վավերացում՝ ստուգելուց հետո, արդյոք օգտատերը մուտք է գործել:

    if (User.Identity.IsAuthenticated)
    {
        return RedirectToAction("Index", "Home");
    }
    System.Web.Helpers.AntiForgery.Validate();
    /* proceed with authentication here */
    
    09.04.2014
  • Շնորհակալություն, սա կարծես թե հիանալի է աշխատում և դեռ ապահովում է նույն անվտանգությունը: 31.05.2016
  • սա ինձ հետ չաշխատեց, այն տալիս է ճիշտ նույն սխալը, բայց այս տողում. System.Web.Helpers.AntiForgery.Validate(); 10.10.2017
  • @AmrElgarhy ճիշտ, հիմա կարող եք բռնել այն: 26.03.2018

  • 3

    Դուք պետք է կարողանաք կարգավորել բացառությունը՝ ավելացնելով գործողությունների զտիչ՝ ձեր սխալը կարգավորելու համար:

    [HandleError(View="AntiForgeryExceptionView", ExceptionType = typeof(HttpAntiForgeryException))]
    

    Դա անելու համար համոզվեք, որ ձեր web.config-ում սովորական սխալները միացված են:

    <customErrors mode="On"/>
    

    Կարող եք նաև դիտել այս բլոգ բռնակի սխալի մասին լրացուցիչ տեղեկությունների համար:

    Խմբագրել Քանի որ դուք օգտագործում եք MVC4, իսկ բլոգը վերաբերում է MVC3-ին, կարող եք նաև դիտել MSDN գրադարան - HandleErrorAttribute, սակայն տարբերակն իրականում չպետք է տարբերություն լինի:

    22.10.2012
  • այո, բայց այս ամենը պատմում է վերահղման մասին (այսպես, այս սխալների հետ վարվելը խախտում է ընթացիկ գործողությունը (կատարումը): Ես կցանկանայի այս սխալը կարգավորել առանց գործողությունների ընդհատման, այնպես որ այս դեպքում կարգավորեք, փոխարինեք օգտվողի անունը և շարունակեք մուտք գործել համապատասխան տվյալների հետ: 23.10.2012
  • Կարծում եմ, որ երբ կարող ես սխալը բռնել, կարող ես այն վերահղել դեպի դիտում (վերահսկիչ), որտեղ փոխարինում ես օգտանունը և շարունակում մուտքը՝ նախկինում մուտքագրված տվյալներով։ Նաև տես՝ stackoverflow.com/questions/1794936/ 23.10.2012

  • 4

    Հին հարց, բայց ես այսօր հանդիպեցի այս խնդրին, և այն լուծեցի՝ վերահղվելով դեպի դուրս գալու գործողությունը այսպես.

    public ActionResult Login(string returnUrl) 
    {
        if (WebSecurity.IsAuthenticated)
            return RedirectToAction("LogOff");
    
        ...
    }
    
    25.08.2015

    5

    Հաղորդագրությունը հայտնվում է մուտք գործելիս՝ նախկինում իսկորոշվելուց հետո:
    Վերարտադրման քայլեր.
    1.) Բացեք ձեր մուտքի էջը և հաստատեք, որ վավերացված չեք:
    2.) Կրկնօրինակեք ներդիրը և Մուտք գործեք երկրորդ ներդիրում:
    3.) Վերադարձեք Առաջին ներդիր և փորձեք մուտք գործել (առանց էջը վերաբեռնելու):
    4.) Դուք տեսնում եք այս Սխալը; եթե ձեր մուտքի գործողությունը զարդարված է [ValidateAntiForgeryToken] հատկանիշով.

    System.Web.Mvc.HttpAntiForgeryException.
    Տրամադրված կեղծիքի դեմ նշանը նախատեսված էր օգտատիրոջ համար,
    , սակայն ներկայիս օգտվողը YourUserNameOrEmailAddress է:

    Այս Օգնականը կատարում է նույն վավերացումը, ինչ [ValidateAntiForgeryToken] հատկանիշը՝

    System.Web.Helpers.AntiForgery.Validate()
    

    Հեռացրեք [ValidateAntiForgeryToken]-ը Մուտքի գործողությունից և դրա փոխարեն օգտագործեք այս մեթոդը:

    Այժմ, երբ Օգտատերն արդեն իսկ վավերացված է, այն կվերահղվի դեպի Գլխավոր էջ:
    Եթե արդեն իսկ վավերացված է, բայց մուտք եք գործում որպես մեկ ուրիշը, ապա դուրս եկեք ընթացիկ օգտատերից և շարունակեք հակակեղծման նշանի վավերացումը նախկինում: Նույնականացում որպես նոր օգտատեր:

    if (User.Identity.IsAuthenticated)
    {
        if (User.Identity.Name == UserName)//User is already Logged in.
            return RedirectToAction("Index", "Home");
        else//Else: User is Logging In as someone else, so Log Out the Current User.
            ResetLogin();
    }
    System.Web.Helpers.AntiForgery.Validate();//Replaces [ValidateAntiForgeryToken].
    //Add your Login Logic below here.
    

    Այնուհետև ավելացրեք այս ֆունկցիան՝ առանց էջը նորից վերաբեռնելու անհրաժեշտության՝ ապահով կերպով վերականգնելու մուտքը.

    private void ResetLogin()
    {
        //Add any additional custom Sign-Out/Log-Off Logic here.
        Session.Abandon();
        FormsAuthentication.SignOut();
    
        //Source: https://stackoverflow.com/questions/4050925/page-user-identity-isauthenticated-still-true-after-formsauthentication-signout
        //The User.Identity is Read-Only, but it reads from HttpContext.User, which we may Reset.  Otherwise it will still show as Authenticated until the next Page Load.
        HttpContext.User = new System.Security.Principal.GenericPrincipal(new System.Security.Principal.GenericIdentity(string.Empty), null);//Do not set Identity to null, because other parts of the code may assume it's blank.
    }
    
    06.08.2021
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..