2014-07-09 3 views
15

मैं अपनी निर्भरता इंजेक्शन स्थापित करने की कोशिश कर रहा हूं और मुझे IAuthenticationManager एएसपी.NET पहचान से OwinContext पर इंजेक्शन देने की आवश्यकता है।Global.asax से OwinContext कैसे प्राप्त करें?

इस मैं अपने Global.asax -> ServiceConfig.Configure() चल रहा से हूँ के लिए:

container.Register(() => HttpContext.Current.GetOwinContext().Authentication); 

लेकिन जब मैं अपने आवेदन चला रहा हूँ मैं यह संदेश प्राप्त:

नहीं owin.Environment आइटम संदर्भ में मिला था

यह HttpContext.Current.GetOwinContext() Global.asax से क्यों उपलब्ध नहीं है?

Startup.cs

[assembly: OwinStartupAttribute(typeof(MyApp.Web.Startup))] 
namespace Speedop.Web 
{ 
    public partial class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      ConfigureAuth(app); 
     } 
    } 
} 

Startup.Auth.cs

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<UserManager<User, int>, User, int>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentityCallback: (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie), 
        getUserIdCallback: (id) => (Int32.Parse(id.GetUserId())) 
        ) 
      } 
     }); 

     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
    } 
} 
+0

पर मौजूद है [इस उत्तर] (http://stackoverflow.com/questions/20168978/do-i-need-a-global-asax-cs-file-at-all -यदि-आईएम का उपयोग-एक-Owin-स्टार्टअप-CS-वर्ग और)। मुख्य रूप से, Global.asax को Startup.cs – Jonesopolis

+0

एचएम से पहले बुलाया जाता है, मेरे पास मेरी निर्देशिका में 'Microsoft.Owin.Host.SystemWeb.dll' है। कॉन्फ़िगरएथ (...) के बाद भी मैंने एक ही संदेश आने के बाद अपने ग्लोबल.एक्सएक्स से स्टार्टअप सीएस में सब कुछ ले जाने की कोशिश की। – janhartmann

+0

मैंने अभी एक नया नमूना ऐप बनाने की कोशिश की और उसी परिणाम के साथ ओविनकॉन्टेक्स्ट प्राप्त करने का प्रयास किया। एक तरीका होना चाहिए :-) – janhartmann

उत्तर

10

मैं के साथ इस तय निम्नलिखित:

container.RegisterPerWebRequest(() => 
{ 
    if (HttpContext.Current != null && HttpContext.Current.Items["owin.Environment"] == null && container.IsVerifying()) 
    { 
     return new OwinContext().Authentication; 
    } 
    return HttpContext.Current.GetOwinContext().Authentication; 

}); 

लगता है जैसे OwnContext नहीं है एसए में मौजूद rtup, तो मैं इसके लिए इंतजार करूँगा और इसे उपस्थित होने के बाद इंजेक्ट करूँगा। कृपया ध्यान दें कि container.IsVerifying()SimpleInjector.Advanced

+0

यह "RegisterPerWebRequest()" क्या है? आप इसे कहां से प्राप्त करते हैं? ऐसा लगता है कि एकता में ऐसी विधि या विस्तार नहीं है – Marty

+0

इसे मिला। आप SimpleInjector का उपयोग कर रहे हैं। ठीक। प्रश्न यह है कि आप इस प्रकार को कैसे पंजीकृत करते हैं। उदाहरण के लिए, नियंत्रक को रेपो की आवश्यकता होती है, जिसे IAuthManager की आवश्यकता होती है। – Marty

+0

क्या कोई जानता है कि कैसल विंडसर के साथ ऐसा कैसे करें? – mayabelle

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