2014-09-03 6 views
10

मैं कटाना परियोजना में अन्य उदाहरणों के आधार पर ओपनआईडी कनेक्ट प्राधिकरण कोड प्रवाह के लिए अपना स्वयं का ओविन मिडलवेयर लिख रहा हूं।OwinContext.Request.Path और PathBase कैसे आते हैं?

इस के हिस्से के रूप में मुझे कुछ यूआरआई बनाना है, उदाहरण के लिए एक रीडायरेक्ट यूआरआई और रिटर्न यूआरएल।

कटाना में अन्य उदाहरण CookieAuthenticationHandler में उदाहरण के लिए वर्तमान अनुरोध से भागों श्रृंखलाबद्ध कर ऐसा करते हैं,

loginUri = 
    Request.Scheme + 
    Uri.SchemeDelimiter + 
    Request.Host + 
    Request.PathBase + 
    Options.LoginPath + 
    new QueryString(Options.ReturnUrlParameter, currentUri); 

मेरा प्रश्न नियम क्या नियंत्रित करने वाले क्या दो पथ गुण में समाप्त होता है है:

OwinContext.Request.Path 
OwinContext.Request.PathBase 

मैंने इन गुणों का निरीक्षण करने की कोशिश की है क्योंकि अनुरोध नीचे दिए गए पाइपलाइन में विभिन्न हैंडलरों के माध्यम से अनुरोध पास होता है:

"https://localhost/Client/login" // Where Client is a virtual directory in IIS 

परिणाम:

  • /लॉगिन, PathBase = "/ क्लाइंट/लॉग इन के लिए" मैप किया हैंडलर में।
  • लेकिन जब अनुरोध मेरे QuillCodeFlowHandler में ApplyResponseChallowAsync विधि को उसी अनुरोध के लिए वापस रास्ते पर, पथबेज = "/ क्लाइंट" और पथ = "/ लॉगिन" पर वापस जाता है।

तो इन मानों को कैसे पॉप्युलेट किया गया है, इसके लिए "नियम" जानने के बिना, बाद में बदल दिया गया, यूआरआई का उपयोग करके उन्हें बनाना मुश्किल है। अगर कोई समझा सकता है, तो उसकी सराहना की जाएगी।

मेरी config का एक उद्धरण है:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, 
    LoginPath = new PathString("/Login") 
}); 

app.UseQuillCodeFlowAuthentication(new QuillCodeFlowOptions()); 

app.Map("/login", map => 
{ 
    map.Run(async ctx => 
    { 
    if (ctx.Authentication.User == null || 
    !ctx.Authentication.User.Identity.IsAuthenticated) 
    {       
     var authenticationProperties = new AuthenticationProperties(); 
     [...] 
     ctx.Authentication.Challenge(authenticationProperties, 
            QuillCodeFlowDefaults.AuthenticationType); 

OWIN specification कुछ स्पष्टीकरण देता है और Microsoft.Owin.Host.HttpListener.GetPathAndQuery विधि जहां पथ चर शुरू में स्थापित कर रहे हैं लगता है।

उत्तर

5

निर्माण का उपयोग करते समय

app.Map("/login", map => [...] 

यह

Owin.MapExtensions.Map 

जो कोड है जो चल रहा है की जरूरत के लिए

Microsoft.Owin.Mapping.MapMiddleware 

का एक उदाहरण का निर्माण का उपयोग करता है।

व्यवहार मैंने देखा है इस मिडलवेयर का आह्वान विधि से समझाया गया है:

public async Task Invoke(IDictionary<string, object> environment) 
{ 
    IOwinContext context = new OwinContext(environment); 

    PathString path = context.Request.Path; 

    PathString remainingPath; 
    if (path.StartsWithSegments(_options.PathMatch, out remainingPath)) 
    { 
     // Update the path 
     PathString pathBase = context.Request.PathBase; 
     context.Request.PathBase = pathBase + _options.PathMatch; 
     context.Request.Path = remainingPath; 

     await _options.Branch(environment); 

     context.Request.PathBase = pathBase; 
     context.Request.Path = path; 
    } 
    else 
    { 
     await _next(environment); 
    } 
} 

मूल रूप से कोड पथ और PathBase से पहले ही प्रतिनिधि चलाता है बदल जाता है (का इंतजार _options.Branch (पर्यावरण)) , तो निष्पादन पूर्ण होने के बाद इन मूल मानों को पर सेट करता है।

इसलिए मैंने जो व्यवहार देखा था, उसे समझाया गया है।

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