2014-06-26 10 views
7

हम अपने प्रोजेक्ट पर एक सफेद लेबल सेट करने का प्रयास कर रहे हैं जो ओविन (एफबी, गूगल, लाइव लॉग इन) शामिल करता है। क्या उनके एपीआई क्रेडेंशियल को गतिशील रूप से सेट करने का कोई तरीका है, कहें कि क्या वे डोमेन बदलते हैं, सेटिंग्स बदल जाएंगी।सेटअप ओविन गतिशील रूप से (डोमेन द्वारा)

मुझे लगता है कि ओविन एमवीसी से पहले लोड करता है? क्या कोई तरीका है कि हम इसे Global.asax (अनुरोध) पर लोड कर सकते हैं?

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 
    } 
} 

अद्यतन:

दूसरे शब्दों में एक भी आवेदन कई डोमेन और उप डोमेन (सफेद लेबलिंग) की मेजबानी करेगा।

उत्तर

5

मैं आज भी वही चीज़ों पर गुगल रहा हूं। तब मुझे http://aspnet.codeplex.com/SourceControl/latest#Samples/Katana/BranchingPipelines/BranchingPipelines.sln पर एक अच्छा ओविन नमूना मिला जो ओविन की शाखाओं की क्षमताओं को समझाता था। यदि मैं इस नमूना को सही ढंग से समझता हूं, तो आप मेजबान हेडर, कुकी, पथ या ऐप का उपयोग करने वाले अनुरोध पैरामीटर जैसे मैप() या ऐप। मैपहेन() विधियों के आधार पर विभिन्न ओविन स्टैक को कॉन्फ़िगर करने में सक्षम होना चाहिए।

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 

     app.MapWhen(ctx => ctx.Request.Headers.Get("Host").Equals("customer1.cloudservice.net"), app2 => 
     { 
      app2.UseWsFederationAuthentication(...); 
     }); 
     app.MapWhen(ctx => ctx.Request.Headers.Get("Host").Equals("customer2.cloudservice.net"), app2 => 
     { 
      app2.UseGoogleAuthentication(...); 
     }); 
    } 
} 
1

मैं एक माइक्रोसॉफ्ट पर काम कर रहा हूँ:

मान लीजिए कि आप 2 अलग डीएनएस भिन्न प्रवेश कॉन्फ़िगरेशन के साथ 2 ग्राहकों का प्रतिनिधित्व डोमेन करते हैं, आप मेजबान हेडर के मूल्य के आधार पर अलग कॉन्फ़िगरेशन का उपयोग करने के Owin प्रारंभ कर सकते हैं ओविन। सुरक्षा डिज़ाइन परिवर्तन जो डेवलपर के लिए अपने ओविन कार्यान्वयन को इंजेक्ट करने की क्षमता का समर्थन करने के लिए प्रमाणीकरण विकल्प (जैसे GoogleAuthenticationOptions) में बहु-किरायेदारी की अनुमति देगा।

यहाँ कटाना परियोजना टीम के मेरे प्रस्ताव है: https://katanaproject.codeplex.com/discussions/561673

मैं भी एक काम कर रहा कार्यान्वयन कि मौजूदा Microsoft.Owin.Security बुनियादी ढांचे के शीर्ष पर बैठता है और मेरे डिजाइन परिवर्तन सुझाव से लाभ नहीं होता है। इसके लिए ऑथ मिडलवेयर (कॉपी पेस्ट मौजूदा) के अपने संस्करण को रोल करने की आवश्यकता है, लेकिन यह एक व्यवहार्य कामकाज है जब तक कि मैं माइक्रोसॉफ्ट में अपना डिज़ाइन परिवर्तन लागू नहीं कर सकता।

https://github.com/kingdango/Owin.OAuth.Multitenant (यह किसी न किसी तरह है, मैं सिर्फ यह आज सुबह मिला)

अंत में मुझे नहीं लगता कि यह सिर्फ बहु किरायेदारी का समर्थन करने के लिए प्रत्येक किरायेदार के लिए कई Owin पाइपलाइनों विकसित करने के लिए समझ में आता है है। सही समाधान है कि मिडलवेयर है जो एक्स्टेंसिबल है और यही वह है जो मैं प्रस्तावित कर रहा हूं।

+0

मैं इस विषय के बारे में आपकी कुछ पोस्टों में आया हूं। बस सोच रहा है कि आप इसके साथ कैसे गए, मुझे रनटाइम पर एपआईडी और संबंधित रहस्य को बदलने की जरूरत है। चूंकि ओविन समय से पहले शुरू हुआ है, इसलिए मैं नियंत्रक के भीतर कुछ भी संशोधित करने में सक्षम नहीं हूं। – user3836415

3

मैं बस इसे ठीक करने की कोशिश में एक अभ्यास के माध्यम से चला गया। दुर्भाग्यवश, स्टार्टअप के बाद कटाना-आधारित होस्ट में सीधे मिडलवेयर इंजेक्ट करने का कोई तरीका नहीं है। इसका कारण यह है कि मिडलवेयर का वास्तव में उपयोग करने के लिए, इसे application delegate में एक साथ बनाया जाना चाहिए। कटाना का कार्यान्वयन IAppBuilder.Build(typeof(AppFunc)) पर कॉल करके करता है, जहां AppFunc एप्लिकेशन प्रतिनिधि के लिए निर्दिष्ट प्रकार का उपयोग उपनाम है: प्रारंभ होने पर Func<IDictionary<string,object>, Task>। यहाँ .Initialize के निचले भाग में प्रमुख लाइन है:

AppFunc = (AppFunc)builder.Build(typeof(AppFunc)); 

केवल अवसर आप मिडलवेयर कॉन्फ़िगर करने के लिए है, इस से पहले है स्टार्टअप वर्ग आप लिखते हैं या web.config द्वारा विन्यास चरण के दौरान।

बस क्या काम करते हैं, मैं कुछ इस तरह के साथ प्रयोग किया गया था नहीं होगा के बारे में बहुत स्पष्ट होना:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     HomeController.Initialized +=() => ConfigureGoogle(app); 
    } 

    private void ConfigureGoogle(IAppBuilder app) 
    { 
     app.UseGoogleAuthentication(/* stuff */); 
    } 
} 

public class HomeController : Controller 
{ 
    public event EventHandler Initialized; 

    [Route("/setup/submit"), AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult SetupSubmit() 
    { 
     /* ... */ 

     Initialized(); 
    } 
} 

यह अपवाद फेंक नहीं है, और वहाँ त्रुटियों की कोई स्पष्ट संकेत हैं - लेकिन यह काम नहीं करता है क्योंकि आवेदन प्रतिनिधि पहले ही इस बिंदु से बना है। कटाना आपको एप्लिकेशन प्रतिनिधि को फिर से बनाने के लिए कोई एपीआई नहीं देती है (और मुझे यकीन नहीं है कि वैसे भी एक अच्छा विचार होगा - ऐसे तंत्र द्वारा बनाई जा सकने वाली अनगिनत बग होगी; उदाहरण के लिए, कैसे होना चाहिए जब सर्वर प्रतिनिधि को प्रारंभिकरण के बाद पुन: संयोजित किया जाता है तो सर्वर एक इन-फ्लाइट अनुरोध संभालता है?)।

आपका विकल्प क्या है? @ डेविडफहलैंडर का दृष्टिकोण सही होगा, लेकिन यदि आप गतिशीलता प्राप्त करना चाहते हैं तो आपको अभी भी सावधान रहना होगा। .MapWhen क्या करता है को देखो:

// put middleware in pipeline before creating branch 
var options = new MapWhenOptions { Predicate = predicate }; 
IAppBuilder result = app.Use<MapWhenMiddleware>(options); 

// create branch and assign to options 
IAppBuilder branch = app.New(); 
configuration(branch); 
options.Branch = (AppFunc)branch.Build(typeof(AppFunc)); 

सबसे पहले, ध्यान दें कि यह एक MapWhenMiddleware प्रकार के साथ कॉल app.Use। इसका मतलब है कि आप पहले की तरह ही सीमाओं का सामना कर रहे हैं - यह सब सामने किया जाना है। प्रारंभिकरण पूर्ण होने से पहले ब्रांडेड मिडलवेयर भी बेक किया जाएगा: अंतिम पंक्ति देखें: branch.Build

गतिशीलता की आपकी एकमात्र आशा भविष्यवाणियों का उपयोग इस तरह से करना है जिससे आपका लक्ष्य प्राप्त हो सके। यह आपको इस प्रक्रिया की 100% नहीं मिलता है, लेकिन यह बहुत रफ़ू करीब हो जाता है: यहाँ

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 

     app.MapWhen(ctx => ClientHasWsFederationConfigured() && ctx.Request.Headers.Get("Host").Equals("customer1.cloudservice.net"), app2 => 
     { 
      app2.UseWsFederationAuthentication(...); 
     }); 
     app.MapWhen(ctx => ClientHasGoogleAuthConfigured() && ctx.Request.Headers.Get("Host").Equals("customer2.cloudservice.net"), app2 => 
     { 
      app2.UseGoogleAuthentication(...); 
     }); 
    } 
} 

सीमाओं इन किया जाएगा:

  • आप अपने सभी समर्थित प्रमाणीकरण प्रकार के कॉन्फिगर करना -front। ऐप चल रहा है, जबकि आप एक नया जोड़ नहीं सकते हैं।
  • ClientHasXXXConfigured प्रत्येक अनुरोध पर चलाया जाएगा। आप जो करते हैं उसके आधार पर, प्रदर्शन के आधार पर यह स्वीकार्य हो सकता है या नहीं भी हो सकता है।

जानकारी आप सवाल में डाल को देखते हुए, मुझे लगता है कि इन समझौतों से के रूप में आप क्या ClientHasXXXConfigured (या इसके बराबर है) करता है के बारे में सावधान कर रहे हैं जब तक ठीक शायद कर रहे हैं।

0

मैं यह काम करने में कामयाब रहा हूं। समस्या मैपवेन के निष्पादन का आदेश है, ठीक से काम नहीं करता है कि यह कैसे सोचता है।

याद रखने की मुख्य बात कॉन्फ़िगरेशन (यानी मैपहेन का दूसरा पैरामीटर) निष्पादित हो जाता है और ऐप स्टार्टअप पर कैश किया जाता है। इस कारण से सावधानी से सोचना महत्वपूर्ण है कि आपको कितनी विन्यास की आवश्यकता है और प्रत्येक अद्वितीय कॉन्फ़िगरेशन के लिए एक अलग 'app.MapWhen' चलाएं। यदि आप एकाधिक डोमेन का उपयोग कर रहे हैं और प्रत्येक एक ही कॉन्फ़िगरेशन का उपयोग करते हैं तो आपको ऐसा करने की आवश्यकता नहीं है, हालांकि यदि प्रत्येक कॉन्फ़िगरेशन प्रति डोमेन अद्वितीय है, तो आपको प्रत्येक के लिए MapWhen चलाने की आवश्यकता होगी। मेरे मामले में मुझे इन्हें फ़ोरैच ब्लॉक में रखना आसान लगता था क्योंकि मुझे प्रत्येक डोमेन को एक अद्वितीय कॉन्फ़िगरेशन देने की आवश्यकता होती थी क्योंकि OpenIDConnect को प्रत्येक के लिए एक अद्वितीय ऐपआईड की आवश्यकता होती है।

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

var domains = new string[] { "abc.com", "def.com" }; 
var host = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]?.ToLower(); 
foreach (string domain in domains) 
{ 
    if (!ShouldEnableForDomain(domain) continue; 
    app.MapWhen(
     context => host == domain, //if true a config will be used from the cache 
     config => 
     { 
      //This executes once on app startup (per domain) and will be cached - it is not executed in the context of a request 
      Trace.WriteLine(String.Format("Setting up configuration: {0}", domain)); 
      config.UseOpenIdConnectAuthentication(GetOpenIdOptions(domain)); 
     } 
    ); 
} 
संबंधित मुद्दे