मैं इसे घंटों तक मार रहा हूं और मैं स्तब्ध हूं। मैं एक विशिष्ट पूर्व-परिभाषित "सुपर" उपयोगकर्ता को ऑटो-लॉगिन करने के प्रयास में एक एमवीसी 5 नियंत्रक के लिए अजाक्स पोस्ट अनुरोध कर रहा हूं। नियंत्रक विधि में, मैं प्रोग्राम को HttpContext.Current.User और प्रमाणित करने की कोशिश कर रहा हूं, इसलिए सुपर उपयोगकर्ता मैन्युअल रूप से लॉग इन करने की प्रक्रिया को छोड़ सकता है। इस पर आम सहमति यहां प्रतीत होती है, जिसे मैंने लागू किया था।

HttpContext.Current.User की स्थापना

यह तब तक काम करता है जब तक कि मैं किसी अन्य प्राधिकारी विधियों को एक कस्टम प्राधिकारी के साथ देखने की कोशिश नहीं करता।

नियंत्रक विधि:

[HttpPost]
[AllowAnonymous]
public ActionResult Login(string username)
{
    string password = ConfigurationManager.AppSettings["Pass"];

    User user = service.Login(username, password);

    var name = FormsAuthentication.FormsCookieName;
    var cookie = Response.Cookies[name]; 
    if (cookie != null)
    {   
        var ticket = FormsAuthentication.Decrypt(cookie.Value);
        if (ticket != null && !ticket.Expired)
        {
            string[] roles = (ticket.UserData as string ?? "").Split(',');
            System.Web.HttpContext.Current.User = new GenericPrincipal(new FormsIdentity(ticket), roles);
        }
    }

    //...processing result

    return Json(result);
}

सेवा। ऊपर विधि विधि कुकी बनाता है:

FormsAuthentication.SetAuthCookie(cookieValue, false);

हालांकि मैं उपयोगकर्ता सेट कर रहा हूं, जिसमें एक आइडेंटिटी है और IsAuthenticated सत्य है, फ़िल्टरकंटेक्स्ट .ttpContext.User नीचे एक ही उपयोगकर्ता नहीं है। यह अनिवार्य रूप से खाली है जैसे कि इसे कभी नहीं सौंपा गया था, और यह प्रमाणित नहीं है।

public override void OnAuthorization(AuthorizationContext filterContext) 
{
    string[] userDetails = filterContext.HttpContext.User.Identity.Name.Split(char.Parse("|"));
}

मेरे द्वारा पाया जा सकने वाला निकटतम पोस्ट यहां है: ब्राउज़र पर उपलब्ध कार्य - लेकिन एयर क्लाइंट के साथ नहीं!

हालाँकि, इसके लिए फिक्स मेरे लिए पहले से ही था:

<authentication mode="Forms">
  <forms cookieless="UseCookies" timeout="60" loginUrl="~/Account/Login" />
</authentication>

मैं क्या कर रहा हूँ मुझे प्राधिकरण बनाने के लिए याद आ रहा है। Context.User HttpContext.Current.User से मेल खाता है जो मैं नियंत्रक में प्रमाणित कर रहा हूँ?

अद्यतन:

मुझे एहसास है कि मुझे कुकी को ठीक से सेट करने के लिए एक रीडायरेक्ट की आवश्यकता है, मैं सिर्फ उस काम को दूरस्थ रूप से करने में सक्षम नहीं हूं, जैसे कि अजाक्स कॉल के माध्यम से। यहां साइट ए में स्क्रिप्ट क्या है, जब साइट बी पर नियंत्रक पद्धति को निष्पादित करते समय ऐसा लगता है। यह रीडायरेक्ट सत्र को सेट नहीं करता है। यह तब भी मौजूद नहीं होता है जब उपयोगकर्ता अगले नियंत्रक पद्धति पर प्रमाणित करता है। यह मुझे लॉगिन दृश्य में वापस रीडायरेक्ट करता है।

function remoteLogin(id) {
    $.ajax({
        url: "/MyController/RemoteLogin",
        type: "POST",
        dataType: "json",
        data: { "id": id }
    }).done(function (data) {
        if (data) {
            if (data.user) {
                var user = data.user;
                $.ajax({
                    url: "http://siteB.xyz/Account/Login",
                    type: "POST",
                    dataType: "json",
                    data: { "username": user.username, "password": user.password }
                }).done(function (data) {
                    if (data) {
                        window.location.href = "http://siteB.xyz/Next"
                    } else {
                        alert("Fail.");
                    }
                }).fail(function (data) {
                    alert("Fail.");
                });
            } else {
                alert("Fail.");
            }
        }
    }).fail(function (data) {
        alert("Fail.");
    });
}
13
Tsar Bomba 2 पद 2015, 06:31

2 जवाब

सबसे बढ़िया उत्तर

आपके पास जो समस्या है वह इस बिंदु पर है कि आप केवल प्रमाणीकरण कुकी सेट कर रहे हैं, IPrincipal जो प्रपत्र प्रमाणीकरण मॉड्यूल के अंदर बनता है, तब तक नहीं होगा जब तक कि कोई नया अनुरोध न हो - इसलिए उस बिंदु पर HttpContext.User एक अजीब स्थिति में है । एक बार रीडायरेक्ट तब हो जाता है, क्योंकि यह ब्राउज़र से एक नया अनुरोध है कुकी आपके पृष्ठ पर पहुंचने से पहले पढ़ी जाएगी और सही उपयोगकर्ता ऑब्जेक्ट बनाया जाएगा।

अनुरोध पूरा होने के बाद ब्राउज़र पर कुकीज़ केवल सेट की जाती हैं।

3
yazan_ati 5 पद 2015, 23:31

समस्या के साथ करना है जहां आपका एक्शन कोड रिक्वेस्ट प्रोसेसिंग पाइपलाइन के सापेक्ष चल रहा है। आपका कोड ProcessRequest चरण (नीचे देखें) में चल रहा है।

HttpContext.Current.User को AuthenticateRequest ईवेंट हैंडलर द्वारा सेट किए जाने की उम्मीद है। FormsAuthenticationModule इस बात का ध्यान रखता है, जिससे Request.Cookies 'बदल जाता है FormAuthenticationCookie वापस FormsAuthenticationTicket में और फिर एक <में। strong> IPrincipal । वह प्रिंसिपल Request.CurrentUser के रूप में सेट हो जाता है और मेरा मानना है कि Thread.CurrentPrincipal

इसे AuthenticateRequest चरण पर करने की आवश्यकता है क्योंकि अनुरोध कैश उपयोगकर्ता द्वारा भिन्न हो सकता है ( ResolveRequestCache ) और सत्र स्थिति हमेशा करता है ( AcquirRequestState )। इसके अलावा, प्राधिकरण आकार / चरण इस बारे में निर्णय लेता है कि उपयोगकर्ता प्रिंसिपल प्रामाणिकताप्राप्त चरण में सेट है या नहीं, इसके लिए प्राधिकारीरहित / / मजबूत> चरण से गुजरने की आवश्यकता है। एक लॉगिन पृष्ठ पर 401 या 300-स्तरीय पुनर्निर्देश

  • BeginRequest
  • प्रामाणिक
  • प्राधिकृत व्यक्ति (उदा।, उर्ध्वकरणीकरण विधि)
  • ResolveRequestCache
  • MapRequestHandler
  • AcquireRequestState
  • PreRequestHandlerExecute
  • ProcessRequest (HttpHandler, Web Forms, MVC नियंत्रक क्रियाएँ यहाँ रहती हैं)

आप HttpContext.Current.User और Thread.CurrentPrincipal को अपने IPrincipal पर सेट करके इसे लागू करने का प्रयास कर सकते हैं, लेकिन यह केवल उस बिंदु के बाद चलने वाले कोड पर लागू होगा ProcessRequest चरण ... सत्र स्थिति, कैश और प्राधिकरण के बारे में महत्वपूर्ण निर्णय पहले ही किए जा चुके हैं।

सिद्धांत रूप में, आप HttpModule लिखकर और इसे AuthenticateRequest (या global.asax) में लागू करके आप जो कुछ करना चाहते हैं, उसके समान कुछ लागू कर सकते हैं, लेकिन आपके पास अभी तक पहुंच नहीं होगी उच्च स्तर के MVC कंट्रोलर कॉन्सेप्ट्स, सेशन स्टेट आदि। आप HttpContext.Request.QueryString , HttpContext.Request.Formest / strong> और HttpContext का निरीक्षण करने में सक्षम होंगे। निवेदन .Cookies , लेकिन बहुत ज्यादा नहीं। आपको अपने AJAX कॉल से यूज़रनेम HTTP अनुरोध से बाहर निकलना होगा, और या तो कॉल करें FormsAuthentication.SetAuthCookie () या FormsAuthenticationTech और FormsAuthenticationCookie अपने आप को और कुकी को Request.Cookies और Response.Cookies में भर दें। जब तक आपका नियंत्रक तर्क चलता है, मुझे पूरा यकीन है कि अनुरोध प्रमाणित होगा।

2
scottt732 16 पद 2015, 04:34