5

पृष्ठभूमि

मैं एक विरासत एएसपी.NET फॉर्म ऐप से एक एमवीसी 4 ऐप में एक पुनरावृत्ति माइग्रेशन विकसित कर रहा हूं।मैं वर्तमान संदर्भ या उपयोगकर्ता पहचान को एक अलग .NET एप्लिकेशन से कैसे प्राप्त करूं?

यह माइग्रेशन एक समय में एक सेक्शन में हो रहा है, इसलिए विरासत और नए एमवीसी दोनों अनुप्रयोगों को एक साथ चलाने के लिए आवश्यक है। कुछ वर्गों के लिए, उपयोगकर्ता को नए एप्लिकेशन पर निर्देशित किया जाता है, और उन वर्गों के लिए जिन्हें अभी तक माइग्रेट नहीं किया गया है, उपयोगकर्ता को लीगेसी एप्लिकेशन पर वापस (या चालू) निर्देशित किया जाता है।

सर्वर पर, अनुप्रयोगों इस तरह संरचित कर रहे:

LEGACY (.NET 2.0 forms app)-- 
          |--Api (new MVC 4 WebAPI) 
          |--V2 (new MVC 4) 

तो विरासत पर foo पेज के लिए एक कॉल /foo.aspx है और V2 पर यह /V2/foo है।

सबकुछ सी # में है, लेकिन कृपया ध्यान दें कि विरासत ऐप .NET 2.0 पर चल रहा है और वी 2 ऐप .NET 4.5 पर चल रहा है। मुझे यकीन नहीं है कि यह मायने रखता है, लेकिन सोचा कि यह ध्यान रखना महत्वपूर्ण होगा।

मैं सफलतापूर्वक अनुप्रयोगों के बीच उपयोगकर्ता/प्रमाणीकरण राज्य साझा नहीं कर सकते समस्या। जाहिर है, यदि उपयोगकर्ता विरासत ऐप पर लॉग इन करता है, तो मुझे वी 2 ऐप पर अपनी ऑथ कुकी (या इसी तरह की कार्रवाई करने) की आवश्यकता होती है जब एक वी 2 पेज कॉल किया जाता है ताकि उपयोगकर्ता को लॉग इन करने के लिए फिर से संकेत नहीं दिया जा सके।

मैं

मैं दोनों web.config फ़ाइलों में समान authentication और machinekey तत्वों की स्थापना की है क्या प्रयास किया है:

<authentication mode="Forms"> 
     <forms cookieless="UseCookies" defaultUrl="~/someUrl" loginUrl="/" path="/" protection="All" timeout="240" enableCrossAppRedirects ="true" domain="someDomain.com" requireSSL="false" /> 
    </authentication> 
    <machineKey validationKey="DE78CF63226. . .788658D142AB881" decryptionKey="0B97E8BA4C4EB4B4C524. . .54E4622E14168D2D5C84461FA2" validation="SHA1" decryption="AES" /> 

मैं V2 आवेदन की Global.asax में इस कोड की कोशिश की है:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
{ 
    string cookieName = FormsAuthentication.FormsCookieName; 
    HttpCookie authCookie = Context.Request.Cookies[cookieName]; 

    if (authCookie == null) 
    { 
     return; 
    } 
    FormsAuthenticationTicket authTicket = null; 
    try 
    { 
     authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
    } 
    catch 
    { 
     return; 
    } 
    if (authTicket == null) 
    { 
     return; 
    } 
    string[] roles = authTicket.UserData.Split(new char[] { '|' }); 
    var id = new FormsIdentity(authTicket); 
    var principal = new GenericPrincipal(id, roles); 

    //Thread.CurrentPrincipal = principal; 

    Context.User = principal; 
} 

लेकिन मुझे नहीं पता कि यह काम करता है या नहीं, क्योंकि विरासत ऐप मेरे वी 2 ऐप के समान समाधान में नहीं है और इसलिए जब मैं वी 2 ऐप डीबग करता हूं, तो मेरे पास लॉग इन करने का कोई तरीका नहीं है विरासत ऐप और विरासत और वी 2 के बीच hopping के वास्तविक उपयोगकर्ता अनुभव अनुकरण।

मैं भी बस उम्मीद है कि समान मशीन कुंजी मेरे लिए कुछ जादू काम करेगा में मेरी HomeController को यह जोड़ने की कोशिश की है: जाहिर है

ViewBag.UserName = User.Identity.Name; 

, मैं तो ध्यान में रखते हुए किसी HTML तत्व पर ViewBag.UserName बाध्य है, लेकिन यह या तो काम नहीं लग रहा है।

उत्तर

2

पैरेंट ऐप पर मशीन की अनुकूलता मोड = "फ्रेमवर्क 20SP2" सेट करें।

.net 4.5 4.0 (या नीचे) से प्रमाणन टोकन नहीं पढ़ सकते हैं

http://technet.microsoft.com/en-us/subscriptions/index/system.web.configuration.machinekeycompatibilitymode

http://blogs.msdn.com/b/webdev/archive/2012/10/23/cryptographic-improvements-in-asp-net-4-5-pt-2.aspx

+0

यह एक चीज थी जो वास्तव में मेरी स्थिति के लिए काम करती थी! –

1

आप दो ऐप्स के लिए उपयोग कर रहे डोमेन/उप डोमेन क्या हैं? कुकीज़ डोमेन या यहां तक ​​कि सबडोमेन के बीच साझा नहीं की जाती हैं (जब तक कि वाइल्डकार्ड डोमेन पर कुकी सेट न हो, i.e. * .mydomain.com)।

उदाहरण के लिए, यदि वी 1 ऐप v1.somedomain.com पर है और कुकी v1.somedomain.com पर सेट है। फिर वी 2, v2.somedomain.com पर, देखेंगे। हालांकि, यदि आप * .somedomain.com पर कुकी सेट करते हैं, तो दोनों ऐप्स कुकी देखेंगे।

हालांकि, अगर वी 1 v1domain.com पर है और वी 2 v2domain.com पर है, तो आप भाग्य से बाहर हैं। कुकी साझा करने का कोई तरीका नहीं है।

+0

धन्यवाद। मैं वास्तव में इस परिदृश्य से बचने की उम्मीद कर रहा था कि V2 ऐप को इसके उप डोमेन के बजाय मूल डोमेन के उपफोल्डर के रूप में कॉन्फ़िगर करके। इसलिए, चूंकि यह सबफ़ोल्डर में है, तो क्या आपका तर्क अभी भी लागू होगा? धन्यवाद! –

+0

जब तक वे डोमेन साझा करते हैं, कुकी चालू होती है, तो उन्हें दोनों इसे देखने में सक्षम होना चाहिए। –

2

फॉर्म 2.0 के लिए हस्ताक्षर और एन्क्रिप्शन एल्गोरिदम .NET 2.0 और 4.0 के बीच स्विच किया गया; तो अपने 4.0 config में कोशिश

<appSettings> 
    <add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" /> 
    <add key="aspnet:UseLegacyEncryption" value="true" /> 
    <add key="aspnet:UseLegacyMachineKeyEncryption" value="true" /> 
</appSettings> 

नोट अब आप एक लगातार प्रमाणन विधि है कि आपके WebAPI अंतिमबिंदुओं आप CSRF लिए जोखिम रहता है मार रहा है और आप इसे के खिलाफ की रक्षा करने की आवश्यकता होगी। माइक वासन के पास walkthrough एएसपीनेट

+0

इसके लिए धन्यवाद, लेकिन इन तत्वों को web.config में जोड़ने के बाद भी, मैं अभी भी किसी भी उपयोगकर्ता संदर्भ तक नहीं पहुंच सकता। क्या आप एक उदाहरण पोस्ट कर सकते हैं कि मैं लॉग इन उपयोगकर्ता के उपयोगकर्ता नाम को कैसे पुनर्प्राप्त करूं? मैंने 'User.Identity.Name' की कोशिश की है लेकिन यह विफल हो जाता है। क्या मैं कुछ भूल रहा हूँ? धन्यवाद! –

+0

आपको कुछ भी जादुई करने की ज़रूरत नहीं है; ऑथ कुकी * अब * दोनों ऐप्स पर काम करना चाहिए। एक कस्टम प्रमाणीकरण के बिना फॉर्म Vuth के लिए अपने V2 ऐप को कॉन्फ़िगर करके, इसे कुकीज़ को ठीक से साझा करना चाहिए। तो चलिए अभी के लिए वेबपी बिट्स को अनदेखा करते हैं, और साझा करने के लिए v2 और v4 ऐप को कॉन्फ़िगर करने पर ध्यान केंद्रित करते हैं। मैं एक कंकाल स्थापित करने का सुझाव दूंगा, पहले स्वामित्व वाले नमस्ते उपयोगकर्ता बनायेगा। – blowdart

संबंधित मुद्दे

 संबंधित मुद्दे