অ্যান্টি ফোরজি টোকেন ব্যবহারকারী "" এর জন্য বোঝানো হয়েছে তবে বর্তমান ব্যবহারকারী "ব্যবহারকারী নাম"


130

আমি একটি একক পৃষ্ঠার অ্যাপ্লিকেশন তৈরি করছি এবং জালিয়াতি বিরোধী টোকেন নিয়ে একটি সমস্যা অনুভব করছি।

আমি জানি কেন সমস্যাটি হয় আমি ঠিক কীভাবে এটি ঠিক করতে জানি না।

নিম্নলিখিতটি ঘটে গেলে আমি ত্রুটিটি পেয়েছি:

  1. লগ-ইন না করা ব্যবহারকারী একটি ডায়ালগ লোড করে (একটি উত্পন্ন এন্টি-ফোরজি টোকেন সহ)
  2. ব্যবহারকারী ডায়লগ বন্ধ করে দেয়
  3. ব্যবহারকারী লগ ইন
  4. ব্যবহারকারী একই ডায়ালগ খোলে
  5. ব্যবহারকারী কথোপকথনে ফর্ম জমা দেয়

অ্যান্টি ফোরজি টোকেন ব্যবহারকারী "" এর জন্য বোঝানো হয়েছে তবে বর্তমান ব্যবহারকারী "ব্যবহারকারী নাম"

এর কারণটি হ'ল কারণ আমার অ্যাপ্লিকেশনটি 100% একক পৃষ্ঠা, এবং যখন কোনও ব্যবহারকারী সাফল্যের সাথে একটি এজ্যাক্স পোস্টের মাধ্যমে লগ ইন করে /Account/JsonLogin, আমি কেবল সার্ভার থেকে ফিরে "প্রমাণীকরণিত ভিউ" দিয়ে বর্তমান দৃশ্যগুলি স্যুইচ আউট করি তবে পুনরায় লোড করি না পাতা।

আমি জানি এটি কারণ কারণ যদি আমি পৃষ্ঠাটি 3 থেকে 4 ধাপের মধ্যে পুনরায় লোড করি তবে কোনও ত্রুটি নেই।

সুতরাং মনে হচ্ছে @Html.AntiForgeryToken()লোড হওয়া ফর্মটিতে এখনও পৃষ্ঠাটি পুনরায় লোড না হওয়া অবধি পুরানো ব্যবহারকারীর জন্য একটি টোকেন প্রদান করে।

@Html.AntiForgeryToken()নতুন, অনুমোদনপ্রাপ্ত ব্যবহারকারীর জন্য টোকেন ফিরিয়ে দিতে আমি কীভাবে পরিবর্তন করতে পারি ?

আমি একটি নতুন উদ্বুদ্ধ GenericalPrincipalএকটি কাস্টম সঙ্গে IIdentityপ্রত্যেক উপর Application_AuthenticateRequestতাই সময় দ্বারা @Html.AntiForgeryToken()নামক পরার HttpContext.Current.User.Identityহয়, আসলে আমার কাস্টম পরিচয় IsAuthenticatedসত্যতে সম্পত্তি সেট এবং এখনো @Html.AntiForgeryTokenএখনও পুরানো ব্যবহারকারীর জন্য একটি টোকেন রেন্ডার করতে যদি না আমি একটি পৃষ্ঠায় রিলোড না বলে মনে হয়।


আপনি কি সত্যিই যাচাই করতে পারবেন যে @ এইচটিএমএল.আন্টিফৌজরি টোকেন কোডটি পুনরায় লোড না করে কল করা হচ্ছে?
কাইল সি

এটি অবশ্যই হ'ল, আমি এইচটিটিপি কনটেক্সট.কন্টেন.টি পরিদর্শন করতে সফলভাবে বিরতি দিতে পারি I ইউজার অবজেক্ট যেমন আমি উল্লেখ করেছি
সংসদ

2
দয়া করে এটি উল্লেখ করুন: স্ট্যাকওভারফ্লো.
com

@ সংসদ যদি আপনি নীচের উত্তরে কোন বিকল্পটি চেয়েছিলেন দয়া করে বলতে পারেন?
সিদ্ধার্থ পান্ডে

আমি বিশ্বাস করি যে আমি যদি সঠিকভাবে মনে রাখি তবে আমি একটি সম্পূর্ণ পুনরায় লোড নিয়ে যেতে ব্যতিক্রম করেছি। তবে আমি আশা করি খুব শীঘ্রই একটি নতুন প্রকল্পে এই সমস্যাটির মুখোমুখি হব। আমি আরও ভাল কাজের বিকল্পটি বেছে নিলে ফিরে পোস্ট করব Will
সংসদ

উত্তর:


170

এটি হ'ল কারণ অ্যান্টি-ফোরজি টোকেন আরও কার্যকরকরণের জন্য এনক্রিপ্ট করা টোকেনের অংশ হিসাবে ব্যবহারকারীর নামটি এম্বেড করে। আপনি যখন প্রথম কল করবেন @Html.AntiForgeryToken()ব্যবহারকারী লগইন নেই তাই টোকেনটির ব্যবহারকারীর নামটির জন্য একটি ফাঁকা স্ট্রিং থাকবে, ব্যবহারকারী লগ ইন করার পরে, আপনি যদি অ্যান্টি-ফোরজি টোকেনটি প্রতিস্থাপন না করেন তবে এটি বৈধতা পাস করবে না কারণ প্রাথমিক টোকেনটি ছিল বেনামে ব্যবহারকারীর এবং এখন আমাদের পরিচিত ব্যবহারকারীর নাম সহ একটি প্রমাণীকৃত ব্যবহারকারী।

এই সমস্যাটি সমাধান করার জন্য আপনার কাছে কয়েকটি বিকল্প রয়েছে:

  1. ঠিক এখনই আপনার এসপিএকে একটি সম্পূর্ণ পোস্ট করতে দিন এবং পৃষ্ঠাটি পুনরায় লোড হয়ে গেলে এটিতে এম্বেড করা ব্যবহারকারীর নাম সহ অ্যান্টি-ফোরজি টোকন থাকবে।

  2. @Html.AntiForgeryToken()লগ ইন করার পরে ন্যায়বিচারের সাথে আংশিক দৃষ্টিভঙ্গি রাখুন , আরেকটি এজেএক্স অনুরোধ করুন এবং অনুরোধের প্রতিক্রিয়ার সাথে আপনার বিদ্যমান অ্যান্টি-ফোরজি টোকেনটি প্রতিস্থাপন করুন।

  3. কেবল পরিচয় অক্ষম করুন জালিয়াতি বিরোধী বৈধতা সম্পাদন পরীক্ষা করে। আপনার টু নিম্নলিখিত যোগ Application_Start পদ্ধতি: AntiForgeryConfig.SuppressIdentityHeuristicChecks = true


21
@ সংসদ: আপনি এই উত্তরটি গ্রহণ করেছেন, আপনি কোন বিকল্পটি বেছে নিয়েছেন তা আমাদের সাথে ভাগ করে নিতে পারেন?
আর শেরুর্স

9
দুর্দান্ত এবং সাধারণ বিকল্পের জন্য +1 ৩। ওআউথ সরবরাহকারীদের সময়সীমার লগআউটগুলিও এই সমস্যার কারণ হতে পারে।
কোডিং গেছে

18
বিকল্প 3 আমার পক্ষে কাজ করে না। লগ আউট হওয়া অবস্থায় আমি লগইন পৃষ্ঠায় দুটি উইন্ডো খুললাম। এক উইন্ডোতে একজন ব্যবহারকারী হিসাবে লগ ইন, তারপরে অন্যটিতে অন্য একজন ব্যবহারকারী হিসাবে লগ ইন এবং একই ত্রুটি পেয়েছে।
ম্যাকগাজ

5
দুর্ভাগ্যক্রমে, আমি এটির জন্য ভাল সমাধান পেতে পারি না। আমি লগইন পৃষ্ঠা থেকে টোকেনটি সরিয়েছি। আমি এখনও লগইন পরে পোস্টে এটি অন্তর্ভুক্ত।
ম্যাকগাজ

7
বিকল্প 3 আমার পক্ষেও কাজ করে না। তবুও একই ত্রুটি হচ্ছে।
জোয়াও Leme

25

ত্রুটিটি ঠিক করতে আপনার লগইন পাতায় OutputCacheডেটা টীকাগুলি স্থাপন ActionResultকরা উচিত:

[OutputCache(NoStore=true, Duration = 0, VaryByParam= "None")] 
public ActionResult Login(string returnUrl)

3
এটি আমার জন্য সমস্যাটি সমাধান করেছে, মোটামুটি বোঝায়। ধন্যবাদ!
Prime03

আমার ব্যবহারের ক্ষেত্রে ব্যবহারকারীটি একটি লগইন চেষ্টা করেছিল এবং মডেলস্টেটের মাধ্যমে "অ্যাকাউন্ট অক্ষম" যেমন একটি অ্যাকাউন্ট দেখানো হয়েছে d তারপরে যদি তারা আবার লগইন ক্লিক করে তবে তারা এই ত্রুটিটি দেখতে পাবে। যাইহোক, এই ফিক্সটি এন্টি ফোরজি টোকেন ত্রুটির পরিবর্তে কেবল তাদের একটি খালি তাজা লগইন ভিউ দিয়েছে। সুতরাং, একটি স্থির না।
yourpublicdisplayname

আমার কেস: ১. ব্যবহারকারী লগইন () এবং হোম পৃষ্ঠায় অবতরণ। ২. ব্যবহারকারী পিছনে বোতামটি হিট করে লগইন ভিউতে ফিরে যায়। ৩. ব্যবহারকারীর আবার লগইন করুন এবং ত্রুটিটি দেখুন "এন্টি ফোরজি টোকেন ব্যবহারকারীর জন্য বোঝানো হয়েছে" "তবে বর্তমান ব্যবহারকারীটি" ব্যবহারকারী নাম "" ত্রুটি পৃষ্ঠায় ব্যবহারকারী যদি মেনু থেকে অন্য কোনও ট্যাবে ক্লিক করেন তবে অ্যাপ্লিকেশনটি প্রত্যাশা অনুযায়ী কাজ করছিল । উপরের কোড ব্যবহারকারী ব্যবহার করে এখনও পিছনে বোতামটি চাপতে পারে তবে এটি হোম পৃষ্ঠায় পুনঃনির্দেশিত হয়। সুতরাং ব্যবহারকারী ব্যাক বোতামটিকে যতবার হিট করে তা তা হোম পেজে পুনর্নির্দেশ করবে। ধন্যবাদ
রবি

কোনও ধারণা কেন এটি একটি জামারিন ওয়েবভিউতে কাজ করে না?
Noobie3001

1
সম্পূর্ণ ব্যাখ্যার জন্য আউটপুট
ক্যাচিংয়ের

15

এটি আমার অ্যাপ্লিকেশনটির সাথে অনেক সময় ঘটে তাই আমি গুগল করার সিদ্ধান্ত নিয়েছি!

আমি এই ত্রুটি সম্পর্কে একটি সহজ ব্যাখ্যা খুঁজে পেয়েছি! ব্যবহারকারী লগইনের জন্য ডাবল ক্লিক করছে! আপনি নীচের লিঙ্কে অন্য ব্যবহারকারী এটি সম্পর্কে কথা বলতে দেখতে পারেন:

এমভিসি 4 প্রদত্ত অ্যান্টি-ফোরজি টোকেন ব্যবহারকারীর জন্য বোঝানো হয়েছিল তবে বর্তমান ব্যবহারকারী "ব্যবহারকারী"

আমি আসা করি এটা সাহায্য করবে! =)


এটা আমার সমস্যা ছিল। ধন্যবাদ!
Nanou Ponette

8

আমার একই সমস্যা ছিল, এবং এই নোংরা হ্যাকটি এটি ঠিক করে দেওয়া হয়েছে, কমপক্ষে যতক্ষণ না আমি এটিকে ক্লিনার উপায়ে ঠিক করতে পারি।

    public ActionResult Login(string returnUrl)
    {
        if (AuthenticationManager.User.Identity.IsAuthenticated)
        {
            AuthenticationManager.SignOut();
            return RedirectToAction("Login");
        }

...


1
মনে হচ্ছে আমারও একই সমস্যা ছিল। আইএমও এটি কোনও হ্যাক নয়, এটি লগ ইন করার সময় আমাদের সকলের জন্য পরীক্ষা করা উচিত। আমার সমস্যা স্থির করল, আপনাকে ধন্যবাদ।
আলেকজান্দ্রে

7

আপনি ইতিমধ্যে প্রমাণীকরণ করার সময় লগইন করার সময় বার্তাটি উপস্থিত হয়।

এই সহায়কটি [ValidateAntiForgeryToken]বৈশিষ্ট্যের মতো একই জিনিসটি করে ।

System.Web.Helpers.AntiForgery.Validate()

[ValidateAntiForgeryToken]নিয়ামক থেকে বৈশিষ্ট্যটি সরান এবং অ্যাকশন মেথোডে এই সহায়কটি রাখুন।

সুতরাং যখন ব্যবহারকারী ইতিমধ্যে প্রমাণীকরণ করা হয়েছে, হোম পৃষ্ঠায় পুনর্নির্দেশ করুন বা এই যাচাইকরণের পরে বৈধ অ্যান্টি-ফোরজি টোকেন যাচাইকরণ অবিরত না রাখলে।

if (User.Identity.IsAuthenticated)
{
    return RedirectToAction("Index", "Home");
}

System.Web.Helpers.AntiForgery.Validate();

ত্রুটিটি পুনরুত্পাদন করার চেষ্টা করার জন্য, নিম্নলিখিত হিসাবে এগিয়ে যান: আপনি যদি আপনার লগইন পৃষ্ঠায় থাকেন এবং আপনি প্রমাণীকৃত না হন। আপনি যদি ট্যাবটির সদৃশ হন এবং আপনি দ্বিতীয় ট্যাবে লগইন করেন। এবং যদি আপনি লগইন পৃষ্ঠার প্রথম ট্যাবে ফিরে আসেন এবং পৃষ্ঠাটি পুনরায় লোড না করে আপনি লগ ইন করার চেষ্টা করেন ... আপনার এই ত্রুটি রয়েছে।


দুর্দান্ত সমাধান! এটি কার্যকর হয়নি এমন আরও অনেক পরামর্শ দেওয়ার পরেও আমার সমস্যার সমাধান করেছে। প্রথমত এটি ত্রুটিটি পুনরুত্পাদন করার যন্ত্রণা ছিল, যতক্ষণ না আমি আবিষ্কার করেছি যে এটি একই পৃষ্ঠাতে 2 টি ব্রাউজার বা ট্যাব খোলা থাকার কারণে এবং ব্যবহারকারী এক থেকে লগ ইন করতে পারে এবং তারপরে পুনরায় লোড না করে দ্বিতীয় থেকে লগ ইন করে।
নিকি

এই সমাধানের জন্য ধন্যবাদ। আমার জন্যও কাজ করেছেন। আমি পরিচয়টি লগইন ব্যবহারকারীর নামের মতো কিনা তা দেখতে একটি চেক যুক্ত করেছি এবং যদি তাই হয় তবে আমি আনন্দের সাথে ব্যবহারকারীকে লগ ইন করার চেষ্টা চালিয়ে যাচ্ছি এবং এটি না হলে লগ আউট করে। উদাহরণস্বরূপ, চেষ্টা করুন W System.Web.Helpers.AntiForgery.Validate ();} ধরা (HttpAntiForgeryException) {যদি (! ব্যবহারকারীর পরিচয়.আইএসআউটসেন্টিটেড || স্ট্রিং.কম্পারেয়ার (ইউজার.আইডেন্টিটি.নাম, মডেল.ইউজারনেম)! = 0) {// আপনার লগ অফ লজিক এখানে}}
স্টিভ ওভেন

2

প্রোডাকশন সার্ভারে বেশিরভাগ সময় আমার একই ব্যতিক্রম ঘটে।

কেন এমন হয়?

এটি তখন ঘটে যখন ব্যবহারকারী বৈধ শংসাপত্রগুলির সাথে লগইন করে এবং একবার লগ ইন করে এবং অন্য পৃষ্ঠায় পুনঃনির্দেশিত করে, এবং তারা পিছনের বোতামটি চাপ দেওয়ার পরে লগইন পৃষ্ঠাটি প্রদর্শিত হবে এবং আবার তিনি বৈধ শংসাপত্রগুলি প্রবেশ করিয়েছিলেন যে এই ব্যতিক্রম ঘটবে।

কীভাবে সমাধান করব?

কেবল এই লাইনটি যুক্ত করুন এবং নিখুঁত কাজ করুন, কোনও ত্রুটি পাবেন না।

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]

1

আমার নিবন্ধকরণ প্রক্রিয়াটির মধ্যে বেশ সুনির্দিষ্ট হলেও একই ধরণের সমস্যা ছিল। একবার ব্যবহারকারী তাদের কাছে প্রেরিত ইমেল লিঙ্কটিতে ক্লিক করলে, তারা লগ ইন করে এবং আরও কিছু তথ্য পূরণ করার জন্য সরাসরি অ্যাকাউন্ট বিশদ স্ক্রিনে প্রেরণ করা হবে। আমার কোডটি ছিল:

    Dim result = Await UserManager.ConfirmEmailAsync(userId, code)
    If result.Succeeded Then
        Dim appUser = Await UserManager.FindByIdAsync(userId)
        If appUser IsNot Nothing Then
            Dim signInStatus = Await SignInManager.PasswordSignInAsync(appUser.Email, password, True, shouldLockout:=False)
            If signInStatus = SignInStatus.Success Then
                Dim identity = Await UserManager.CreateIdentityAsync(appUser, DefaultAuthenticationTypes.ApplicationCookie)
                AuthenticationManager.SignIn(New AuthenticationProperties With {.IsPersistent = True}, identity)
                Return View("AccountDetails")
            End If
        End If
    End If

আমি দেখতে পেলাম যে রিটার্ন ভিউ ("অ্যাকাউন্টডেটেলস") আমাকে টোকেন ব্যতিক্রম দিচ্ছে, আমি অনুমান করছি কারণ কনফার্মইমেল ফাংশনটি AllowAnonymous দিয়ে সজ্জিত ছিল তবে অ্যাকাউন্টডেটেল ফাংশনটিতে ValidateAntiForgeryToken ছিল।

রিটার্ন টু রিটার্ন রিডাইরেক্টটঅ্যাকশন ("অ্যাকাউন্টডেটেল") পরিবর্তন করা আমার জন্য সমস্যাটি সমাধান করেছে।


1
[OutputCache(NoStore=true, Duration=0, VaryByParam="None")]

public ActionResult Login(string returnUrl)

আপনি আপনার লগইন (পান) ক্রিয়াটির প্রথম লাইনে ব্রেক পয়েন্ট রেখে পরীক্ষা করতে পারেন। আউটপুট ক্যাশে নির্দেশ যুক্ত করার আগে ব্রেক্টপয়েন্টটি প্রথম লোডটিতে আঘাত হানা হত, তবে ব্রাউজারের পিছনে বোতামটি ক্লিক করার পরে তা হবে না। নির্দেশিকা যুক্ত করার পরে আপনার ব্রেকআপপয়েন্টটি প্রতিবার হিট হওয়ার সাথে শেষ হওয়া উচিত, সুতরাং অ্যান্টিফোর্জিটোকেন মূলটি হবে, খালিটি নয়।


0

আমার একক পৃষ্ঠার এএসপি.নেট এমভিসি কোর অ্যাপ্লিকেশন নিয়ে একই সমস্যা ছিল। আমি HttpContext.Userসমস্ত নিয়ন্ত্রণকারী ক্রিয়াকলাপ স্থাপন করে এটি সমাধান করেছি যা বর্তমান পরিচয় দাবিগুলি পরিবর্তন করে (যেহেতু এখানে আলোচনা করা হয়েছে এমভিসি কেবল পরবর্তী অনুরোধগুলির জন্য এটি করে )। আমি আমার প্রতিক্রিয়াগুলিতে অ্যান্টিফোর্জি কুকিগুলিকে যুক্ত করতে মিডলওয়্যারের পরিবর্তে ফলাফল ফিল্টার ব্যবহার করেছি, এটি নিশ্চিত করে যে তারা কেবলমাত্র এমভিসি ক্রিয়া ফিরে আসার পরে তৈরি হয়েছিল।

কন্ট্রোলার (এনবি। আমি এএসপি.নেট কোর আইডেন্টিটি দিয়ে ব্যবহারকারীদের পরিচালনা করছি):

[Authorize]
[ValidateAntiForgeryToken]
public class AccountController : Controller
{
    private SignInManager<IdentityUser> signInManager;
    private UserManager<IdentityUser> userManager;
    private IUserClaimsPrincipalFactory<IdentityUser> userClaimsPrincipalFactory;

    public AccountController(SignInManager<IdentityUser> signInManager, UserManager<IdentityUser> userManager, IUserClaimsPrincipalFactory<ApplicationUser> userClaimsPrincipalFactory)
    {
        this.signInManager = signInManager;
        this.userManager = userManager;
        this.userClaimsPrincipalFactory = userClaimsPrincipalFactory;
    }

    [HttpPost]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string username, string password)
    {
        if (username == null || password == null)
        {
            return BadRequest(); // Alias of 400 response
        }

        var result = await signInManager.PasswordSignInAsync(username, password, false, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            var user = await userManager.FindByNameAsync(username);

            // Must manually set the HttpContext user claims to those of the logged
            // in user. Otherwise MVC will still include a XSRF token for the "null"
            // user and token validation will fail. (MVC appends the correct token for
            // all subsequent reponses but this isn't good enough for a single page
            // app.)
            var principal = await userClaimsPrincipalFactory.CreateAsync(user);
            HttpContext.User = principal;

            return Json(new { username = user.UserName });
        }
        else
        {
            return Unauthorized();
        }
    }

    [HttpPost]
    public async Task<IActionResult> Logout()
    {
        await signInManager.SignOutAsync();

        // Removing identity claims manually from the HttpContext (same reason
        // as why we add them manually in the "login" action).
        HttpContext.User = null;

        return Json(new { result = "success" });
    }
}

অ্যান্টিফোর্জি কুকি সংযোজন ফিল্টার ফলাফল:

public class XSRFCookieFilter : IResultFilter
{
    IAntiforgery antiforgery;

    public XSRFCookieFilter(IAntiforgery antiforgery)
    {
        this.antiforgery = antiforgery;
    }

    public void OnResultExecuting(ResultExecutingContext context)
    {
        var HttpContext = context.HttpContext;
        AntiforgeryTokenSet tokenSet = antiforgery.GetAndStoreTokens(context.HttpContext);
        HttpContext.Response.Cookies.Append(
            "MyXSRFFieldTokenCookieName",
            tokenSet.RequestToken,
            new CookieOptions() {
                // Cookie needs to be accessible to Javascript so we
                // can append it to request headers in the browser
                HttpOnly = false
            } 
        );
    }

    public void OnResultExecuted(ResultExecutedContext context)
    {

    }
}

স্টার্টআপ.সি এক্সট্র্যাক্ট:

public partial class Startup
{
    public Startup(IHostingEnvironment env)
    {
        //...
    }

    public IConfigurationRoot Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

        //...

        services.AddAntiforgery(options =>
        {
            options.HeaderName = "MyXSRFFieldTokenHeaderName";
        });


        services.AddMvc(options =>
        {
            options.Filters.Add(typeof(XSRFCookieFilter));
        });

        services.AddScoped<XSRFCookieFilter>();

        //...
    }

    public void Configure(
        IApplicationBuilder app,
        IHostingEnvironment env,
        ILoggerFactory loggerFactory)
    {
        //...
    }
}

-3

ইন্টারনেট-শপটিতে অ্যান্টি-ফোরজি-টোকেন বৈধতা নিয়ে সমস্যা আছে: ব্যবহারকারীরা অনেকগুলি ট্যাব (পণ্য সহ) খোলেন এবং একটিতে লগ ইন করার পরে অন্যটিতে লগ ইন করার চেষ্টা করে এবং এই জাতীয় অ্যান্টিফর্জিএক্সেপশন পেয়েছিলেন। সুতরাং, অ্যান্টিফর্গ্রি কনফিগ.সপ্রেসআইডেন্টিটি হিউরিস্টিক চেকস = সত্য আমার পক্ষে সাহায্য করেনি, তাই আমি এই ধরনের কুৎসিত হ্যাকফিক্স ব্যবহার করেছি, সম্ভবত এটি কারওর জন্য সহায়ক হবে:

   public class ExceptionPublisherExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext exceptionContext)
    {
        var exception = exceptionContext.Exception;

        var request = HttpContext.Current.Request;
        if (request != null)
        {
            if (exception is HttpAntiForgeryException &&
                exception.Message.ToLower().StartsWith("the provided anti-forgery token was meant for user \"\", but the current user is"))
            {
                var isAjaxCall = string.Equals("XMLHttpRequest", request.Headers["x-requested-with"], StringComparison.OrdinalIgnoreCase);
                var returnUrl = !string.IsNullOrWhiteSpace(request["returnUrl"]) ? request["returnUrl"] : "/";
                var response = HttpContext.Current.Response;

                if (isAjaxCall)
                {
                    response.Clear();
                    response.StatusCode = 200;
                    response.ContentType = "application/json; charset=utf-8";
                    response.Write(JsonConvert.SerializeObject(new { success = 1, returnUrl = returnUrl }));
                    response.End();
                }
                else
                {
                    response.StatusCode = 200;
                    response.Redirect(returnUrl);
                }
            }
        }


        ExceptionHandler.HandleException(exception);
    }
}

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ExceptionPublisherExceptionFilter());
        filters.Add(new HandleErrorAttribute());
    }
}

মনে করুন, অ্যান্টি-জালিয়াতি-টোকেন প্রজন্মের বিকল্পগুলি সেট করা যেতে পারে, ব্যবহারকারীর নাম বা এর মতো কিছু বাদ দিতে।


12
প্রশ্নটিতে সমস্যাটি মোকাবেলার এটি একটি ভয়ানক উদাহরণ। এটি ব্যবহার করবেন না।
xxbbcc

সম্পূর্ণভাবে xxbbcc এর সাথে একমত।
জাভিয়ের

ঠিক আছে, কেসটি ব্যবহার করুন: অ্যান্টি ফোরজি টোকেন সহ লগইন ফর্ম। এটি 2 ব্রাউজার ট্যাবে খুলুন। প্রথমে লগ ইন করুন। আপনি দ্বিতীয় ট্যাব রিফ্রেশ করতে পারবেন না । দ্বিতীয় ট্যাব থেকে লগ ইন করার চেষ্টা করা ব্যবহারকারীদের জন্য সঠিক আচরণের জন্য আপনি কোন সমাধানের পরামর্শ দিচ্ছেন?
ব্যবহারকারী 3364244

@ ইউজার ৩6464৪৪৪৪: সঠিক আচরণ নিম্নলিখিতটি করতে পারে: ওয়েবসকেট বা সিগন্যালআর ব্যবহার করে একটি বাহ্যিক লগইন সনাক্ত করুন। এই একই অধিবেশন তাই আপনি এটি আমি অনুমান :-) কাজ করতে পারে
dampee
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.