2017-05-28 7 views
5

मैं किसी वेबपेज जो एक ही आवेदन के लिए एक से अधिक URL का उपयोग करता है:एकाधिक और asp.net कोर पहचान में उप डोमेन के कुकी

उदाहरण के लिए

: * .MyWebPage.com.au * .YourWebPage.com.au

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

उदाहरण के लिए, यदि वे www.mywebpage.com.au के माध्यम से लॉगिन करते हैं तो कुकी को * .mywebpage.com.au के लिए सेट करने की आवश्यकता होती है या यदि वे www.yourwebpage.com.au के माध्यम से लॉगिन करते हैं तो कुकी * होनी चाहिए। yourwebpage.com.au।

startup.cs (या startup.auth.cs) फाइल करने के लिए ASP.NET मूल पहचान अंक के लिए उप डोमेन की इजाजत दी और कुछ इस तरह प्रवेश करने में प्रलेखन के अधिकांश: `

app.UseCookieAuthentication(new CookieAuthenticationOptions() 
      { 
       CookieDomain = "mywebpage.com.au" 
      });` 

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

+0

मैं बिल्कुल निश्चित नहीं हूं; लेकिन, इस तरह के मामले के लिए - मैं लगभग सकारात्मक हूं, आपको अपना स्वयं का कुकी मिडलवेयर बनाना होगा, या बनाना होगा। – Svek

+0

बहु-किरायेदार एएसपी.NET कोर पाइपलाइनों को अनुमति देने के लिए सासकिट का उपयोग करने का यह विचार एक संभावित समाधान हो सकता है http://benfoster.io/blog/aspnet-core-multi-tenant-middleware-pipelines – Svek

उत्तर

4

जब मैंने शुरू किया तो मुझे पता नहीं चला कि पहचान और कुकीई प्रमाणीकरण के बीच अंतर क्या था। जब से मैं पहचान

 app.UseIdentity(); 

app.UseCookieAuthentication उपयोग कर रहा था समाधान नहीं था।

मुझे अंततः आईसीकी मैनेजर को लागू करके मेरा समाधान मिला। एक कक्षा में अब

services.AddIdentity<ApplicationUser, IdentityRole>(options => 
     { 
      options.Password.RequireDigit = false; 
      options.Password.RequiredLength = 5; 
      options.Password.RequireNonAlphanumeric = false; 
      options.Password.RequireLowercase = false; 
      options.Password.RequireUppercase = false; 
      options.Cookies.ApplicationCookie.CookieManager = new CookieManager(); //Magic happens here 
     }).AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 

मैं CookieManager.cs कहा जाता है:

Startup.cs में

:

यहाँ मेरी हल है

public class CookieManager : ICookieManager 
{ 
    #region Private Members 

    private readonly ICookieManager ConcreteManager; 

    #endregion 

    #region Prvate Methods 

    private string RemoveSubdomain(string host) 
    { 
     var splitHostname = host.Split('.'); 
     //if not localhost 
     if (splitHostname.Length > 1) 
     { 
      return string.Join(".", splitHostname.Skip(1)); 
     } 
     else 
     { 
      return host; 
     } 
    } 

    #endregion 

    #region Public Methods 

    public CookieManager() 
    { 
     ConcreteManager = new ChunkingCookieManager(); 
    } 

    public void AppendResponseCookie(HttpContext context, string key, string value, CookieOptions options) 
    { 

     options.Domain = RemoveSubdomain(context.Request.Host.Host); //Set the Cookie Domain using the request from host 
     ConcreteManager.AppendResponseCookie(context, key, value, options); 
    } 

    public void DeleteCookie(HttpContext context, string key, CookieOptions options) 
    { 
     ConcreteManager.DeleteCookie(context, key, options); 
    } 

    public string GetRequestCookie(HttpContext context, string key) 
    { 
     return ConcreteManager.GetRequestCookie(context, key); 
    } 

    #endregion 
+0

किसी भी व्यक्ति जो एचटीआई लागू करता है, आप विकल्पों को जोड़ने, हटाने की घटना को संभालने की भी आवश्यकता होगी। डोमेन = निकालें सबडोमेन (context.Request.Host.Host) – michael

1

कितने मुख्य डोमेन हैं? यदि बहुत अधिक नहीं हैं, तो आप कई कुकी प्रमाणीकरण विकल्प जोड़ सकते हैं। इस तरह:

 app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = "mywebpage.com.au", 
      CookieDomain = "mywebpage.com.au", 
     }); 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = "yourwebpage.com.au", 
      CookieDomain = "yourwebpage.com.au", 
     }); 

यदि बहुत सारे मुख्य डोमेन हैं, तो आपको अपना स्वयं का कुकी प्रदाता लिखना होगा।

1

@ माइकल के समाधान के अलावा:

  • ICookie: ICookie Interfacehttp cookie object के शीर्ष पर एक अमूर्त परत है, जो data सुरक्षित करता है।
  • ICookieManager: Cookie ManagerICookie Interface के शीर्ष पर एक अमूर्त परत है। यह <TSource> जेनेरिक समर्थन, Func<TResult> के संदर्भ में कुकी व्यवहार को बढ़ाता है। इसे DefaultCookieManager कक्षा द्वारा कार्यान्वित किया गया है। ICookie Interface इस वर्ग की एक वंचितता है।
  • CookieManager का उपयोग:

    1. स्टार्टअप कॉन्फ़िगर सेवा में CookieManager जोड़ें।
    2. कुकी मैनेजर एपीआई एक्सेस करें।
    3. और स्रोत कोड git पर Nemi Chand पर उपलब्ध है।
0

@ माइकल के जवाब के अलावा: कैसे "deletecookie घटना को संभालने बताया options.Domain = RemoveSubdomain (context.Request.Host.Host)" के लिए: सिर्फ जोड़ने

options.Domain= RemoveSubdomain(context.Request.Host.Host); 

से पहले

ConcreteManager.DeleteCookie(context, key, options); 

में

कुकी मैनेजर। डेलेटेकोकी (..) {..};

और कुकी मैनेजर को कॉल करना न भूलें। लॉगआउट पर डेलेटेकॉकी!

पीएस इसके अलावा, अगर आपको subdomain.example.com और example.com पर दोनों को लॉगिन करने में सक्षम होना आवश्यक है - आपको AppendResponseCookie (..) {..} को संशोधित करने की आवश्यकता है, या आपको केवल टीएलडी मिलेगा। कॉम/.ru आदि) यहां

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