ASP.NET_SessionId + OWIN কুকিজ ব্রাউজারে প্রেরণ করে না


145

ওউইন কুকি প্রমাণীকরণ ব্যবহার করে আমার একটি অদ্ভুত সমস্যা রয়েছে।

আমি যখন শুরু করি তখন আমার আইআইএস সার্ভারের প্রমাণীকরণ আইই / ফায়ারফক্স এবং ক্রোমে পুরোপুরি সূক্ষ্ম কাজ করে।

প্রমাণীকরণ এবং বিভিন্ন প্ল্যাটফর্মে লগ ইন করে কিছু পরীক্ষা করা শুরু করেছিলাম এবং আমি একটি অদ্ভুত ত্রুটি নিয়ে এসেছি। স্পষ্টতই ওউইন ফ্রেমওয়ার্ক / আইআইএস ব্রাউজারগুলিতে কোনও কুকিজ প্রেরণ করে না। আমি একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড টাইপ করব যা কোডটি সঠিকভাবে চালিত হয় তবে কোনও কুকি ব্রাউজারে দেওয়া হয় না। যদি আমি সার্ভারটি পুনরায় চালু করে এটি কাজ করা শুরু করে তবে কিছু সময় আমি লগইন করে চেষ্টা করব এবং আবার কুকিজ বিতরণ বন্ধ হবে। কোডটির পদক্ষেপে কিছু হয় না এবং কোনও ত্রুটি নিক্ষেপ করে।

 app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationMode = AuthenticationMode.Active,
            CookieHttpOnly = true,
            AuthenticationType = "ABC",
            LoginPath = new PathString("/Account/Login"),
            CookiePath = "/",
            CookieName = "ABC",
            Provider = new CookieAuthenticationProvider
               {
                  OnApplyRedirect = ctx =>
                  {
                     if (!IsAjaxRequest(ctx.Request))
                     {
                        ctx.Response.Redirect(ctx.RedirectUri);
                     }
                 }
               }
        });

এবং আমার লগইন পদ্ধতির মধ্যে আমার কাছে নিম্নলিখিত কোড রয়েছে:

IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                            authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);

var authentication = HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("ABC");
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.User_ID.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, role.myRole.ToString()));
    authentication.AuthenticationResponseGrant =
        new AuthenticationResponseGrant(identity, new AuthenticationProperties()
                                                   {
                                                       IsPersistent = isPersistent
                                                   });

authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, identity);

আপডেট 1: মনে হচ্ছে সমস্যার এক কারণ হ'ল যখন আমি সমস্যাগুলি সেশনে আইটেম যুক্ত করি। সাধারণ কিছু যোগ করা Session.Content["ABC"]= 123সমস্যা মনে হচ্ছে।

আমি যা করতে পারি তা নীচে: 1) (Chrome) লগইন করার সময় আমি ASP.NET_SessionId + আমার প্রমাণীকরণের কুকি পাই। ২) আমি এমন একটি পৃষ্ঠায় যাচ্ছি যা একটি সেশন কন্টেন্টস সেট করে ... 3) একটি নতুন ব্রাউজার খুলুন (ফায়ারফক্স) এবং লগইন করার চেষ্টা করুন এবং এটি কোনও এএসপি.এনইT_ সেশনআইড পায় না এবং এটি কোনও প্রমাণীকরণ কুকি পায় না 4) প্রথম ব্রাউজারে ASP.NET_Sશન রয়েছে এটি কাজ চালিয়ে যায়। আমি এই কুকিটি সরিয়ে নেওয়ার মুহুর্তে এটি অন্যান্য সমস্যাযুক্ত আইপি ঠিকানার (10.XXX) এবং লোকালহোস্টে অন্য যে সমস্ত ব্রাউজারে কাজ করছি তাতে একই সমস্যা রয়েছে।

আপডেট 2: এর ফোর্স সৃষ্টি ASPNET_SessionIdOWIN প্রমাণীকরণের সামনে আমার login_load পৃষ্ঠাতে প্রথম।

1) OWIN এর সাথে প্রমাণীকরণের আগে আমি Session.Contentআমার লগইন পৃষ্ঠায় এএসপি.এন.ইস.এসইশনআইডি শুরু করার জন্য একটি এলোমেলো মান তৈরি করি 2) তারপরে আমি প্রমাণীকরণ করি এবং আরও অধিবেশন তৈরি করি 3) অন্যান্য ব্রাউজারগুলি এখন কাজ করছে বলে মনে হচ্ছে

এটা উদ্ভট। আমি কেবল এই সিদ্ধান্তে পৌঁছাতে পারি যে এএসপি এবং ওউইউআইএন এর সাথে কিছু চিন্তা আছে যে তারা বিভিন্ন ডোমেনে বা এ জাতীয় কিছুতে রয়েছে।

আপডেট 3 - দুজনের মধ্যে অদ্ভুত আচরণ।

অতিরিক্ত অদ্ভুত আচরণ চিহ্নিত করা হয়েছে - ওউইনের সময়সীমা এবং এএসপি সেশনটি আলাদা। আমি যা দেখছি তা হল যে আমার ওউইন সেশনগুলি কোনও যান্ত্রিকতার মাধ্যমে আমার এএসপি সেশনের চেয়ে বেশি দিন বেঁচে থাকবে। সুতরাং লগ ইন করার সময়: ১।) আমার কাছে একটি কুকি ভিত্তিক লেখক সেশন রয়েছে)) আমি কয়েকটি সেশন ভেরিয়েবল সেট করি

ওউন কুকি সেশন ভেরিয়েবলের পুনরায় লগইন করার আগে আমার সেশন ভেরিয়েবলগুলি (2) "মারা" যায় যা আমার পুরো অ্যাপ্লিকেশন জুড়ে অপ্রত্যাশিত আচরণের কারণ হয়। (ব্যক্তি লগ ইন করেছেন তবে সত্যই লগ ইন নেই)

আপডেট 3 বি

কিছু খননের পরে আমি একটি পৃষ্ঠায় কিছু মন্তব্য দেখেছি যা বলছে যে "ফর্মগুলি" প্রমাণীকরণের সময়সীমা এবং সেশনের সময়সীমা মিলিয়ে নেওয়া দরকার। আমি সাধারণত ভাবছি দুজনে সমন্বয় হয় তবে যে কারণেই দু'জনে সিঙ্ক হয় না।

কর্মক্ষেত্রের সংক্ষিপ্তসার

1) প্রমাণীকরণের আগে সর্বদা একটি সেশন তৈরি করুন। আপনি অ্যাপ্লিকেশন শুরু করার সময় মূলত সেশন তৈরি করুনSession["Workaround"] = 0;

২) [পরীক্ষামূলক] যদি আপনি কুকিগুলি অবিরত করেন তবে নিশ্চিত করুন যে আপনার ওউইন টাইমআউট / দৈর্ঘ্যটি আপনার ওয়েবকনফাইগের সময় থেকে আপনার সেশনটির চেয়ে বেশি হবে (পরীক্ষায়)


1
অ্যাকশনারসাল্ট লগইন এবং অ্যাকশনারসাল্ট এক্সটার্নাললগিনে একটি সেশন কল যুক্ত করার বিষয়টি নিশ্চিত করতে পারে Can আমি নিশ্চিত যে কেবলমাত্র একজনের প্রয়োজন তবে আমার উভয় জায়গায় রয়েছে।
স্কট

ধন্যবাদ! ... বহিরাগত লগিনে অধিবেশন যুক্ত করা আমার জন্য এটি ঠিক করে দিয়েছে ... এটি ভুডু যাদু ... আমি ইতিমধ্যে এই সমস্যাটি সন্ধান করতে
h

উত্তর:


159

আমি একই সমস্যার মুখোমুখি হয়েছি এবং OWIN ASP.NET হোস্টিং বাস্তবায়নের কারণটি সনাক্ত করেছি। আমি এটি একটি বাগ বলব।

কিছু পটভূমি

আমার অনুসন্ধানগুলি এই সমাবেশগুলির সংস্করণগুলির উপর ভিত্তি করে:

  • মাইক্রোসফ্ট.উইন, সংস্করণ = ২.০.২.০, সংস্কৃতি = নিরপেক্ষ, পাবলিককি টোকেন = ৩১ বিএফ 858566 এডি ৩64ee35
  • মাইক্রোসফট.উইন.হোস্ট.সিস্টেমওয়েব, সংস্করণ = ২.০.২.০, সংস্কৃতি = নিরপেক্ষ, পাবলিককি টোকেন = ৩১ বিএফ ৩8585856 এডি 3৪ee35
  • সিস্টেম.ওয়েব, সংস্করণ = 4.0.0.0, সংস্কৃতি = নিরপেক্ষ, পাবলিককি টোকেন = b03f5f7f11d50a3a

ওউইউন প্রতিক্রিয়া কুকিজ ( মাইক্রোসফ্ট.উইন.সেস্পোনসকুকি সংগ্রহণ ) নিয়ে কাজ করতে এটির নিজস্ব বিমূর্তি ব্যবহার করে । এই প্রয়োগটি সরাসরি প্রতিক্রিয়া শিরোনাম সংগ্রহের মোড়কে দেয় এবং সে অনুযায়ী সেট-কুকির শিরোনাম আপডেট করে । ওউইন এএসপি.নেট হোস্ট ( মাইক্রোসফ্ট.উইন.হোস্ট.সিস্টেমওয়েব ) স্রেফ সিস্টেম.ওয়েব.হট্টপ্রেস্পনস এবং এটির শিরোনাম সংগ্রহ সংগ্রহ করে। সুতরাং যখন OWIN- র মাধ্যমে নতুন কুকি তৈরি করা হবে, তখন প্রতিক্রিয়া সেট-কুকির শিরোনামটি সরাসরি পরিবর্তন করা হয়।

তবে এএসপি.নেট প্রতিক্রিয়া কুকিজের সাথে কাজ করতে এটির নিজস্ব বিমূর্ততাও ব্যবহার করে। এটি আমাদের কাছে System.Web.HttpResponse.Cookies সম্পত্তি হিসাবে প্রকাশ করা হয়েছে এবং সিলড ক্লাস দ্বারা প্রয়োগ করা হয়েছে System.Web.HttpCookie Colલેક્શન । এই প্রয়োগটি সরাসরি প্রতিক্রিয়া সেট-কুকি শিরোনামে আবদ্ধ করে না তবে প্রতিক্রিয়া অবজেক্টের পরিবর্তিত অবস্থা হিসাবে প্রকাশ করতে কিছু অপ্টিমাইজেশান এবং মুষ্টিমেয় অভ্যন্তরীণ বিজ্ঞপ্তি ব্যবহার করে।

তারপরে অনুরোধকালীন এক দফায় দেরি হয়েছে যেখানে এইচটিটিপি কুকি কালেকশন পরিবর্তিত রাষ্ট্রের পরীক্ষা করা হয় ( System.Web.HttpResponse.GenerateResponseHeediaForCookies () ) এবং কুকিগুলি সেট-কুকির শিরোনামে সিরিয়ালিত করা হয় । যদি এই সংগ্রহটি নির্দিষ্ট কিছু স্থানে থাকে তবে পুরো সেট-কুকি শিরোনামটি প্রথমে সংগ্রহের মধ্যে থাকা কুকিজ থেকে পরিষ্কার এবং পুনরায় তৈরি করা হয়।

এএসপি.এনইটি অধিবেশন বাস্তবায়ন সিস্টেম.ওয়েব.হট্টপ্রেস্পোনস.কুকিজের সম্পত্তি এটির জন্য এএসপি.এনইT_ সেশনআইডি কুকি ব্যবহার করে। এছাড়াও এএসপি.এনইটি সেশন স্টেট মডিউল ( সিস্টেম.ওয়েব.সেশনস্টেট।সেশনস্টেটমোডুল ) এর অ_ সংস্থান স্থিত সম্পত্তি দ্বারা s_sessionEverSet নামে প্রয়োগ করা হয়েছে যা কিছুটা স্ব-বর্ণনামূলক in আপনি যদি কখনও নিজের অ্যাপ্লিকেশনটিতে সেশন স্টেটের জন্য কিছু সঞ্চয় করেন তবে এই মডিউলটি প্রতিটি অনুরোধের জন্য আরও কিছু কাজ করবে।


আমাদের লগইন সমস্যা ফিরে

এই সমস্ত টুকরো দিয়ে আপনার পরিস্থিতি ব্যাখ্যা করা যেতে পারে।

কেস 1 - অধিবেশন কখনও সেট করা হয়নি

সিস্টেম.ওয়েব.সেশনস্টেট.সেশনস্টেটমডিউল , s_sessionEverSet সম্পত্তিটি মিথ্যা। কোন সেশনের আইডি এর সেশনকে মডিউল এবং দ্বারা উত্পন্ন হয় System.Web.HttpResponse.Cookies সংগ্রহ রাষ্ট্র পরিবর্তন সনাক্ত করা যায়নি । এই ক্ষেত্রে ওউইন কুকিগুলি ব্রাউজারে সঠিকভাবে প্রেরণ করা হয় এবং লগইন কাজ করে।

কেস 2 - সেশনটি অ্যাপ্লিকেশনটিতে কোথাও ব্যবহৃত হয়েছিল, তবে ব্যবহারকারীর অনুমোদনের চেষ্টা করার আগে নয়

সিস্টেম.ওয়েব.সেশনস্টেট.সেশনস্টেটমডিউল , s_sessionEverSet সম্পত্তি সত্য। সেশন আইডিগুলি সেশনস্টেটমডিউল দ্বারা উত্পাদিত হয় , এএসপি.এনই T_SessionId সিস্টেমটিতে যুক্ত করা হয়েছে e ওয়েব.হট্টপ্রেস্পোনস ook কুকিজ সংগ্রহের পরে এটি অনুরোধকালে আজীবন সরিয়ে ফেলা হয়েছে কারণ ব্যবহারকারীর সেশনটি ফাঁকা রয়েছে। এই ক্ষেত্রে System.Web.HttpResponse.Cookies সংগ্রহ রাষ্ট্র পরিবর্তন সনাক্ত করা এবং সেট-কুকি আগে কুকিজ হেডার মান ধারাবাহিকভাবে হয় হেডার প্রথম সাফ করা হয়।

এই ক্ষেত্রে OWIN প্রতিক্রিয়া কুকিগুলি "হারিয়ে গেছে" এবং ব্যবহারকারী প্রমাণীকৃত নয় এবং লগইন পৃষ্ঠায় পুনঃনির্দেশিত হয়।

কেস 3 - ব্যবহারকারীর অনুমোদনের চেষ্টা করার আগে সেশনটি ব্যবহৃত হয়

সিস্টেম.ওয়েব.সেশনস্টেট.সেশনস্টেটমডিউল , s_sessionEverSet সম্পত্তি সত্য। সেশন আইডি এর দ্বারা উত্পন্ন হয় SessionStateModule , ASP.NET_SessionId যোগ করা হয় System.Web.HttpResponse.CookiesSystem.Web.HttpCookie Col લેક્શન এবং System.Web.HttpResponse.GenerateResponseHeediaForCookies () সেট-কুকি শিরোনামটি অভ্যন্তরীণ অনুকূলতার কারণে সেটটি প্রথমে সাফ করা হয়নি তবে কেবল আপডেট হয়েছে updated

এই ক্ষেত্রে উভয় OWIN প্রমাণীকরণ কুকিজ এবং ASP.NET_SenseId কুকি প্রতিক্রিয়া এবং লগইন কাজ প্রেরণ করা হয়।


কুকিজ নিয়ে আরও সাধারণ সমস্যা

আপনি দেখতে পাচ্ছেন যে সমস্যাটি আরও সাধারণ এবং এএসপি.নেট সেশনে সীমাবদ্ধ নয়। আপনি যদি মাইক্রোসফ্ট.উইন.হোস্ট.সিস্টেমওয়েবের মাধ্যমে ওউইন হোস্ট করছেন এবং আপনি / কিছু সরাসরি সিস্টেম.ওয়েব.হট্ট্প্রেস্পোনস.কুকিজ সংগ্রহ ব্যবহার করছেন তবে আপনি ঝুঁকির মধ্যে আছেন।

উদাহরণস্বরূপ এটি কাজ করে এবং উভয় কুকিজই সঠিকভাবে ব্রাউজারে প্রেরণ করা হয় ...

public ActionResult Index()
{
    HttpContext.GetOwinContext()
        .Response.Cookies.Append("OwinCookie", "SomeValue");
    HttpContext.Response.Cookies["ASPCookie"].Value = "SomeValue";

    return View();
}

তবে এটি হয় না এবং ওউনকুকি "হারিয়ে" ...

public ActionResult Index()
{
    HttpContext.GetOwinContext()
        .Response.Cookies.Append("OwinCookie", "SomeValue");
    HttpContext.Response.Cookies["ASPCookie"].Value = "SomeValue";
    HttpContext.Response.Cookies.Remove("ASPCookie");

    return View();
}

উভয়ই ভিএস2013, আইআইএসই এক্সপ্রেস এবং ডিফল্ট এমভিসি প্রকল্প টেম্পলেট থেকে পরীক্ষা করা হয়েছে।


7
আমি আমাদের পরীক্ষার পরিবেশে এই সমস্যাটি ডিবাগ করার এবং সমাধান করার চেষ্টা করতে কয়েক দিন ব্যয় করেছি। আমি খুঁজে পাওয়া একমাত্র কর্মক্ষেত্রটি আপনি প্রস্তাবিত হিসাবে একই (ব্যবহারকারী অনুমোদনের আগে সেশন সেট করা)। আমি সমস্যাটি কেটানপ্রজেক্টকে জানিয়েছি ... katanaproject.codeplex.com/workitem/197 , তাই সম্ভবত কেউ সেখানে মন্তব্য করবে।
টমাস দোলজাল

11
এটি একটি দুর্দান্ত গুরুতর ত্রুটি, বিশেষত যেহেতু তারা vs2013 এর টেম্পলেটটির মধ্যে রয়েছে package
পাইটর স্টুলিনস্কি

2
যে কেউ এটিকে আরও তদন্ত করতে চায় তাদের জন্য, আমি গিথুব.com
নীলস্কি

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

2
অবশেষে! কি আশ্চর্য বিষয় এটি। ধন্যবাদ. এই উত্তরটি লেখার দু'বছর পরে এটি এখনও একটি সমস্যা।
স্পভিনিয়াস

43

@ টমাসডোলজাল দ্বারা দুর্দান্ত বিশ্লেষণ শুরু করে আমি ওউইন এবং সিস্টেম উভয়কেই দেখেছি e ওয়েব উত্স।

সমস্যাটি হ'ল System.Web এর কুকি তথ্যের নিজস্ব মাস্টার উত্স রয়েছে এবং সেটি সেট-কুকি শিরোনাম নয়। ওউইন কেবল সেট-কুকির শিরোনাম সম্পর্কে জানে। ওউইন দ্বারা নির্ধারিত যে কোনও কুকিজও HttpContext.Current.Response.Cookiesসংগ্রহের মধ্যে সেট করা আছে তা নিশ্চিত করার জন্য একটি কার্যপ্রণালী হ'ল ।

আমি একটি ছোট মিডলওয়্যার ( উত্স , নুগেট ) তৈরি করেছি যা ঠিক এটি করে, যা কুকি মিডলওয়্যার রেজিস্ট্রেশনের উপরে অবিলম্বে স্থাপন করার উদ্দেশ্যে।

app.UseKentorOwinCookieSaver();

app.UseCookieAuthentication(new CookieAuthenticationOptions());

1
এই চেষ্টা করে দেখুন। যেহেতু asp.net পরিচয় 2.2.0-alpha1 এর পরে আমি কেবল লগইন নয় ব্যবহারকারীকে লগ আউট করতেও সমস্যা করতে শুরু করি (ব্যবহারকারী লগআউট ক্লিকে লগ আউট করবেন না | সাধারণত, আমি যখন ওয়েবসাইটটি কিছু সময়ের জন্য উন্মুক্ত রেখেছিলাম তখন) কিছুই না করে |) .. এবং ব্যবহারকারীরা লগইন করার আগে লগইন সমস্যার সমাধানের ঠিক আগে একটি সেশন স্থির করার পরেও লগআউট সমস্যা অব্যাহত থাকে .. আপনার প্রচেষ্টার জন্য ধন্যবাদ .. যাইহোক, ইনস্টলেশন ছাড়া আমার কিছু করা উচিত? প্যাকেজ?
উফ!

আপনাকে এটি app.UseKentorCookieMiddlewareSaver();স্টার্টআপ.অথ.সি.সি. সহ সক্রিয় করতে হবে । এটিতে লগআউট কুকি ক্লিয়ারিংও পরিচালনা করা উচিত।
অ্যান্ডার্স আবেল

আপনাকে অনেক ধন্যবাদ আন্ডারস আবেল, লগইন এবং লগআউট উভয়ই এখন ঠিকঠাক কাজ করে। তবে উপরের মন্তব্যে কোডটি পরিবর্তন করা দরকার (কারণ আমি এটি অনুসরণ করেছি :) কোনও সাফল্য ছাড়াই):app.UseKentorOwinCookieSaver() এবং প্যাকেজের গিটহাব পৃষ্ঠায় যেমন আপনার মূল উত্তর অন্তর্ভুক্ত ।
উওর

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

@ অ্যান্ডারস এবেল আমি এই গিথুব প্রকল্পের জন্য মিটআপ সাইনআপগুলি যুক্ত করার চেষ্টা করছি: github.com/owin-middleware/OwinOAuthProvider ''। আমি অন্য দিন আসনকে যুক্ত করেছিলাম এবং কোনও সমস্যা ছিল না, তবে কোনও কারণে, মেটআপের সাথে, অ্যাকাউন্টে // বহিরাগতলগিনক্যালব্যাক বাতিল হয়ে প্রত্যাশিত প্রমাণীকরণের ব্যবস্থা করুন etGetExternLoginInfoAsync () পদ্ধতিটি ফিরে আসছে। দুর্ভাগ্যক্রমে, আপনার নিউগেট প্যাকেজটি আমার সমস্যার সমাধান করেনি। আমি ভাবছিলাম যে আমার সাথে পর্যালোচনা করার জন্য আপনার কাছে কিছু সময় ছিল কারণ আপনি সমস্যাটি আরও ভালভাবে সমাধান করতে এবং আপনার প্রকল্পে এগিয়ে যেতে সক্ষম হতে পারেন।
অ্যান্টনি রাফিনো

42

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

public class SystemWebCookieManager : ICookieManager
{
    public string GetRequestCookie(IOwinContext context, string key)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
        var cookie = webContext.Request.Cookies[key];
        return cookie == null ? null : cookie.Value;
    }

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);

        bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
        bool pathHasValue = !string.IsNullOrEmpty(options.Path);
        bool expiresHasValue = options.Expires.HasValue;

        var cookie = new HttpCookie(key, value);
        if (domainHasValue)
        {
            cookie.Domain = options.Domain;
        }
        if (pathHasValue)
        {
            cookie.Path = options.Path;
        }
        if (expiresHasValue)
        {
            cookie.Expires = options.Expires.Value;
        }
        if (options.Secure)
        {
            cookie.Secure = true;
        }
        if (options.HttpOnly)
        {
            cookie.HttpOnly = true;
        }

        webContext.Response.AppendCookie(cookie);
    }

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        AppendResponseCookie(
            context,
            key,
            string.Empty,
            new CookieOptions
            {
                Path = options.Path,
                Domain = options.Domain,
                Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
            });
    }
}

আপনার অ্যাপ্লিকেশন প্রারম্ভের সময়, আপনি যখন নিজের ওউইএন নির্ভরতা তৈরি করেন কেবল তখনই এটি নির্ধারণ করুন:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    ...
    CookieManager = new SystemWebCookieManager()
    ...
});

এখানে একটি অনুরূপ উত্তর সরবরাহ করা হয়েছে তবে এতে সমস্যা সমাধানের জন্য প্রয়োজনীয় সমস্ত কোড-বেস অন্তর্ভুক্ত নয়, সুতরাং আমি এটি এখানে যুক্ত করার প্রয়োজন দেখছি কারণ কাতানা প্রকল্পের বাহ্যিক লিঙ্কটি নীচে চলে যেতে পারে এবং এটি পুরোপুরি দীর্ঘস্থায়ী হওয়া উচিত একটি সমাধান হিসাবে এখানে।


ধন্যবাদ, এটি আমার পক্ষে কাজ করে, তবে আমি এই কন্ট্রোলার কনটেক্সট.এইচটিটিপি কনটেক্সট.সেশন.আরমোভএল () কে ফোন করে সমস্ত অধিবেশন সাফ করে দিই; এক্সটার্নলজিনক্যালব্যাক ফাংশনে
আদনান

এএসপি.এনইটি ওয়েবফর্মগুলি 4.6.1 এ প্রযোজ্য ? আমার ওয়েব অ্যাপ্লিকেশনটি ব্যবহার করেASP.NET Webforms, OWIN, ADFS
কিকুইনেট

@ কিউইনেট আপনার ওয়েব অ্যাপ্লিকেশন কি ওউইন কুকি ব্যবহার করে? তারপর হ্যাঁ.
আলেকজান্দ্রু

কোডে Startup.ConfigureAuthআমাদের আছে app.UseCookieAuthenticationএবং app.UseWsFederationAuthenticationশেষ পর্যন্ত app.UseStageMarker
কুইকিনেট

@ আলেকজান্দ্রু আপনি একটি সম্পাদনা বিবেচনা করতে পারেন, আমার দল এই বাগটিকে আঘাত করেছে এবং এটি বিরল এবং এলোমেলো ছিল, এটি ডিইভি এবং ইউএটি পরিবেশের মাধ্যমে আমাদের কাছ থেকে লুকিয়েছিল। আপনার উত্তর থেকে এই উদ্ধৃতিটি আমাদের কাছে রাখা হয়নি: "। নেট কুকি ম্যানেজার সর্বদা জিতবে।" এটি সন্ধান করা এবং ঠিক করা সহজ হবে, যদি ওউইন কুকি সর্বদা আমাদের ওআইডিসির মিডলওয়্যারের কোনও ওভাররাইট না হয়ে থাকে তবে এটি আমাদের ডেভ ওয়ার্কস্টেশনগুলি বন্ধ করে দেয় না। তবে এলোমেলোতার অর্থ বাগটি আমাদের স্কেল পর্যন্ত আঘাত করার আগে এটি 2 দিনের জন্য উত্পাদন করার সমস্ত পথে তৈরি হয়েছিল (আমাদের অভ্যন্তরীণ অর্ধেক ব্যবহার এএডি মাধ্যমে লগইন করতে পারে নি)। মনে মনে যদি আমি আপনার উত্তর থেকে "সর্বদা" শব্দটি সরিয়ে ফেলি?
yzorg

17

টমাস দোলজার ইস্যুটির বিষয়ে কাতানা টিম জবাব দিয়েছিল , এবং কাজের ক্ষেত্র সম্পর্কে নথি পোস্ট করেছে :

কাজের ক্ষেত্র দুটি বিভাগে পড়ে two একটি হ'ল সিস্টেমটি পুনরায় কনফিগার করা e ওয়েব তাই এটি প্রতিক্রিয়া ব্যবহার করা এড়িয়ে যায় ook অন্য পদ্ধতিটি হ'ল ক্ষতিগ্রস্থ ওউআইএন উপাদানগুলি পুনরায় কনফিগার করা যাতে তারা সরাসরি সিস্টেমে কুকি লেখেন e ওয়েবে এর প্রতিক্রিয়া ook কুকিজ সংগ্রহ।

  • প্রমাণীকরণের আগে সেশনটি প্রতিষ্ঠিত হয়েছে তা নিশ্চিত করুন: System.Web এবং কাতানা কুকিজের মধ্যে দ্বন্দ্ব অনুরোধ অনুযায়ী, সুতরাং অ্যাপ্লিকেশনটির পক্ষে প্রমাণীকরণ প্রবাহের আগে কিছু অনুরোধে সেশনটি স্থাপন করা সম্ভব। ব্যবহারকারীর প্রথম আসার সময় এটি করা সহজ হওয়া উচিত, তবে সেশন বা লেখক কুকিজের মেয়াদ শেষ হয়ে গেলে এবং / অথবা সতেজ হওয়া দরকার পরে পরে গ্যারান্টি দেওয়া আরও কঠিন হতে পারে।
  • সেশনস্টেটমডিউলটি অক্ষম করুন - যদি অ্যাপ্লিকেশনটি সেশন তথ্যের উপর নির্ভর করে না, তবে সেশন মডিউলটি এখনও একটি কুকি সেট করে যা উপরের বিরোধের কারণ হয়ে থাকে, তবে আপনি সেশন স্টেট মডিউলটি অক্ষম করার কথা বিবেচনা করতে পারেন।
  • সরাসরি System.Web এর কুকি সংগ্রহে সরাসরি লেখার জন্য কুকিঅথেন্টিকেশনমিলডওয়্যারটি পুনরায় কনফিগার করুন।
app.UseCookieAuthentication(new CookieAuthenticationOptions
                                {
                                    // ...
                                    CookieManager = new SystemWebCookieManager()
                                });

ডকুমেন্টেশন থেকে SystemWebCookieManager বাস্তবায়ন দেখুন (উপরের লিঙ্ক)

আরও তথ্য এখানে

সম্পাদন করা

সমস্যা সমাধানের জন্য আমরা গৃহীত পদক্ষেপগুলির নীচে। 1. এবং 2. উভয়ই পৃথকভাবে সমস্যার সমাধান করেছেন তবে আমরা উভয় ক্ষেত্রেই ঠিকঠাক ক্ষেত্রে প্রয়োগ করার সিদ্ধান্ত নিয়েছি:

1. সিস্টেমওয়েবুকি ম্যানেজারটি ব্যবহার করুন

2. সেশন ভেরিয়েবল সেট করুন:

protected override void Initialize(RequestContext requestContext)
{
    base.Initialize(requestContext);

    // See http://stackoverflow.com/questions/20737578/asp-net-sessionid-owin-cookies-do-not-send-to-browser/
    requestContext.HttpContext.Session["FixEternalRedirectLoop"] = 1;
}

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

সম্পাদনা 2

কটানা প্রকল্প 2016-05-14 থেকে অনুলিপি করুন :

এটি যুক্ত করুন:

app.UseCookieAuthentication(new CookieAuthenticationOptions
                                {
                                    // ...
                                    CookieManager = new SystemWebCookieManager()
                                });

...এবং এই:

public class SystemWebCookieManager : ICookieManager
{
    public string GetRequestCookie(IOwinContext context, string key)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
        var cookie = webContext.Request.Cookies[key];
        return cookie == null ? null : cookie.Value;
    }

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);

        bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
        bool pathHasValue = !string.IsNullOrEmpty(options.Path);
        bool expiresHasValue = options.Expires.HasValue;

        var cookie = new HttpCookie(key, value);
        if (domainHasValue)
        {
            cookie.Domain = options.Domain;
        }
        if (pathHasValue)
        {
            cookie.Path = options.Path;
        }
        if (expiresHasValue)
        {
            cookie.Expires = options.Expires.Value;
        }
        if (options.Secure)
        {
            cookie.Secure = true;
        }
        if (options.HttpOnly)
        {
            cookie.HttpOnly = true;
        }

        webContext.Response.AppendCookie(cookie);
    }

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        AppendResponseCookie(
            context,
            key,
            string.Empty,
            new CookieOptions
            {
                Path = options.Path,
                Domain = options.Domain,
                Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
            });
    }
}

আমি এই উত্তরটি আরও সহজবোধ্য এবং সমস্যাটি সমাধান করা সহজ find ধন্যবাদ, - সম্ভবত আমি খুব হঠাৎ কথা বলেছি। এটি আমার সমস্যার সমাধান করেনি।
জে সি এস

@ জিসিএস সমস্যা সমাধানের জন্য আমরা গ্রহণ করা পদক্ষেপগুলি অন্তর্ভুক্ত করেছে। আপনার সমস্যা সম্পর্কিত কিনা তা আপনি খুঁজে পেয়েছেন?
থমিয়াস

আমি প্রমাণীকরণের জন্য সেশন ম্যানেজমেন্টের জন্য ওয়েব অপি 2 + ওউন মিডলওয়্যার + রিডিস ক্যাশে ব্যবহার করছি। আমি সিস্টেমউইবকুকি ম্যানেজারটি ব্যবহার করার চেষ্টা করেছি এবং আমার যে সমস্যাটি ছিল সেখানে লেখক কুকিজ সেট করা হয়নি তা এটি সমাধান করে নি। ব্যবহার "UseKentorOwinCookieSaver" এটা মীমাংসিত কিন্তু আমি একটি অতিরিক্ত বহিরাগত নির্ভরতা খুব অনুরাগী নই ...
JCS

অধিবেশন ক্লিয়ারিং আমার পক্ষে কাজ করেছিল। কোনও বাহ্যিক নির্ভরতার প্রয়োজন নেই। কল করার আগে এটিকে ControllerContext.HttpContext.Session.RemoveAll();আপনার ক্রিয়াতে রাখুন । আমি জানি না এটির সেরা সমাধান কিনা, তবে এটি সবচেয়ে সহজ। ExternalLogin()ChallengeResult()
অ্যালিসন

1
@ শিমিট্যাক্স নিশ্চিত, কেবল নোট করুন ?.(নাল-কন্ডিশনাল অপারেটর) কেবলমাত্র সি # 6
তে

5

উত্তরগুলি ইতিমধ্যে সরবরাহ করা হয়েছে, তবে 3..১.০-তে একটি সিস্টেমউইচচিংকিংকি ম্যানেজার শ্রেণি রয়েছে যা ব্যবহার করা যায়।

https://github.com/aspnet/AspNetKatana/blob/dev/src/Microsoft.Owin.Host.SystemWeb/SystemWebChunkingCookieManager.cs

https://raw.githubusercontent.com/aspnet/AspNetKatana/c33569969e79afd9fb4ec2d6bdff877e376821b2/src/Microsoft.Owin.Host.SystemWeb/SystemWebChunkingCookieManager.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    ...
    CookieManager = new SystemWebChunkingCookieManager()
    ...
});

এটি এখনও 3.1.0 এ কোনও সমস্যা?
সাইবারকন্ট

1
হ্যাঁ, এটি এখনও আমার জন্য 3.1.0 এ একটি সমস্যা এবং এই কুকি পরিচালককে প্রয়োজন, ডিফল্ট হিসাবে এখনও চঙ্কিংকুকি ম্যানেজার।
jonmeyer

কোথায় ব্যবহার করা যাবে? এবং কিভাবে?
সাইমন_ ওয়েভার

@ জোনমিয়ার ধন্যবাদ আমি মনে করি গতকাল আমি সিস্টেমসিসিএম এবং সিসিএমের মধ্যে পার্থক্যটি মিস করেছি তাই আমি অবশ্যই এটি পরীক্ষা করে নেব
সাইমন_উইভার

উপরের লাইনে যোগ করার পরেও এটি আমার পক্ষে কাজ করে না। আমি ৩.১.০ সংস্করণ ব্যবহার করছি। মূলত আমি প্রথমবার লগইন করতে সক্ষম হয়েছি কিন্তু লগআউট করার পরে এটি আমাকে লগইন করতে দেয় না।
মিতিন দীক্ষিত

3

আপনি যদি ওউইন মিডলওয়্যারটিতে নিজেরাই কুকি সেট করে থাকেন তবে ব্যবহার করছেন OnSendingHeaders করে সমস্যাটি আরও বেড়ে যাবে বলে মনে হচ্ছে।

উদাহরণস্বরূপ, নীচের কোডটি ব্যবহার করে owinResponseCookie2সেট করা হবে, যদিও owinResponseCookie1তা নয়:

private void SetCookies()
{
    var owinContext = HttpContext.GetOwinContext();
    var owinResponse = owinContext.Response;

    owinResponse.Cookies.Append("owinResponseCookie1", "value1");

    owinResponse.OnSendingHeaders(state =>
    {
        owinResponse.Cookies.Append("owinResponseCookie2", "value2");
    },
    null);

    var httpResponse = HttpContext.Response;
    httpResponse.Cookies.Remove("httpResponseCookie1");
}

3

আমি একই ইস্যু মুখোমুখি ভিসুয়াল স্টুডিও 2017 এবং .net MVC 5.2.4 , Nuget আপডেট করা হচ্ছে Microsoft.Owin.Security.Google সর্বশেষ সংস্করণ যা বর্তমানে হয় 4.0.1 আমার জন্য কাজ! আশা করি এটি কাউকে সহায়তা করে!


1
এই এক উপর আমার বেকন সংরক্ষণ করা! অ্যান্ড্রয়েড ক্রোমের সাথে একটি সমস্যা ছিল বিশেষভাবে এলোমেলোভাবে প্রমাণীকরণ হারাতে। এই থ্রেডের আর কিছুই কাজ করেনি। আমি VS2019 এবং এএসপি এমভিসি 5 ব্যবহার করছি
zfrank

2

দ্রুততম এক-লাইন কোড সমাধান:

HttpContext.Current.Session["RunSession"] = "1";

ক্রিয়েটআইডেন্টিটি পদ্ধতির আগে এই লাইনটি যুক্ত করুন:

HttpContext.Current.Session["RunSession"] = "1";
var userIdentity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
_authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = rememberLogin }, userIdentity);

1
আপনি এই কোডটি কোথায় রেখেছেন HttpContext.Current.Session["RunSession"] = "1";? মধ্যে Globa.asax Session_Start ?
কিকিনেট

1
এটি আসলে সহজতম এবং দ্রুত সমাধান উপলব্ধ and । এই সমাধানটি আইএমএইচওকে অবমূল্যায়ন করা হয়।
ডের জিঞ্জার

আমি এটিকে ইস্যুআউট টোকেন পদ্ধতির শীর্ষে আমার আথম্যানেজারে যুক্ত করেছি
আলেকজান্ডার

1

আমার একই লক্ষণ ছিল যে সেট-কুকির শিরোনামটি প্রেরণ করা হচ্ছে না তবে এই উত্তরগুলির কোনওটিই আমাকে সহায়তা করেনি। আমার লোকাল মেশিনে সমস্ত কিছুই কাজ করেছিল তবে যখন প্রোডাক্টে স্থাপন করা হয় তখন সেট-কুকি শিরোনামগুলি কখনই সেট হয়ে যায় না।

দেখা যাচ্ছে এটি একটি কাস্টম ব্যবহারের সংমিশ্রণ ছিল CookieAuthenticationMiddleware পাশাপাশি WebApi এর সাথে WebApi সংক্ষেপণ সমর্থন

ভাগ্যক্রমে আমি আমার প্রকল্পে ELMAH ব্যবহার করছিলাম যা আমাকে এই ব্যতিক্রমটি লগ হতে দেয়:

System.Web.HttpException সার্ভার HTTP শিরোনাম প্রেরণের পরে শিরোনাম সংযোজন করতে পারে না।

যা আমাকে এ দিকে পরিচালিত করেছিল গিটহাব ইস্যুতে নিয়ে গেছে

মূলত, আপনার মতো আমার মতো একটি অদ্ভুত সেটআপ থাকলে আপনি আপনার ওয়েবএপিআই কন্ট্রোলার / কুকিগুলি সেট করে এমন পদ্ধতিগুলির জন্য সংক্ষেপণ অক্ষম করতে চান বা এটির চেষ্টা করতে পারেন OwinServerCompressionHandler

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.