मेरे पास एक नियंत्रक है जहां मैं निर्माता में एक सेवा इंटरफ़ेस इंजेक्शन दे रहा हूं। सेवा में इसके कन्स्ट्रक्टर में इंजेक्शन भी इंटरफेस है। आईओसी कंटेनर (एकता) को किसी दिए गए इंटरफ़ेस के लिए लौटने वाले वर्गों में से एक का निर्माण करते समय उपयोगकर्ता के बारे में जानकारी का उपयोग करने की आवश्यकता होती है।एएसपी.नेट एमवीसी नियंत्रक से पहले प्रमाणित
क्या हो रहा है, कि नियंत्रक से पहले [अधिकृत] विशेषता मूल्यांकन किया जाता है instantiated जा रहा है और उपयोगकर्ता को प्रमाणीकृत किया जाता है। यह एकता को निर्भरता इंजेक्शन करने के लिए मजबूर करता है और लॉग इन करने से पहले उपयोगकर्ता के बारे में जानकारी का उपयोग करता है। इनमें से कोई भी समस्या नहीं थी जब हम एकीकृत विंडोज प्रमाणीकरण का उपयोग कर रहे थे, लेकिन अब हम Azure AD से OpenID Connect का उपयोग कर रहे हैं और उपयोगकर्ता जानकारी isn ' जब तक वे लॉग इन नहीं करते हैं तब तक टी (नियंत्रक के बाद होता है)।
मैंने सुना(अन्य पदों में) प्रमाणीकरण प्रक्रिया में पहले स्थानांतरित करने के लिए मेरी Owin स्टार्टअप वर्ग कॉन्फ़िगर करने के लिए एक तरीका है कि है, लेकिन मैं ऐसा करने के तरीके के बारे में कोई उदाहरण नहीं मिल सकता है। नियंत्रक को तत्काल होने से पहले मुझे होने वाले प्रमाणीकरण की आवश्यकता है।
यहाँ मैं क्या है की एक सरल उदाहरण है ...
नियंत्रक:
[Authorize]
public class MyController : Controller
{
private readonly IMyService myService;
public MyController(IMyService myService)
{
this.myService = myService;
}
// ...
}
एकता विन्यास:
public class UnityBootstrap : IUnityBootstrap
{
public IUnityContainer Configure(IUnityContainer container)
{
// ...
return container
.RegisterType<ISomeClass, SomeClass>()
.RegisterType<IMyService>(new InjectionFactory(c =>
{
// gather info about the user here
// e.g.
var currentUser = c.Resolve<IPrincipal>();
var staff = c.Resolve<IStaffRepository>().GetBySamAccountName(currentUser.Identity.Name);
return new MyService(staff);
}));
}
}
Owin स्टार्टअप (Startup.Auth.cs):
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = this.clientID,
Authority = this.authority,
PostLogoutRedirectUri = this.postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = context =>
{
context.ProtocolMessage.DomainHint = this.domainHint;
return Task.FromResult(0);
},
AuthorizationCodeReceived = context =>
{
var code = context.Code;
var credential = new ClientCredential(this.clientID, this.appKey.Key);
var userObjectID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
var authContext = new AuthenticationContext(this.authority, new NaiveSessionCache(userObjectID));
var result = authContext.AcquireTokenByAuthorizationCode(code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, this.graphUrl);
AzureAdGraphAuthenticationHelper.Token = result.AccessToken;
return Task.FromResult(0);
}
}
});
}
मैं भी इस पर फिसल गया डि सामान में से किसी के बिना यद्यपि। उपयोगकर्ता नियंत्रक के कन्स्ट्रक्टर में उपयोगकर्ता की आवश्यकता है, और उपयोगकर्ता को 'प्राधिकृत एट्रिब्यूट' ने उपयोगकर्ता को स्थानांतरित करने से पहले कन्स्ट्रक्टर को देखकर आश्चर्यचकित किया। –
इस तरह का एक स्पष्टीकरण क्यों है http://stackoverflow.com/a/4462767/10245 –