Kurucuya bir hizmet arabirimi enjekte ettiğim bir denetleyicim var. Hizmet, arabirimine de yapıcı arayüzleri enjekte etti. IoC konteynerinin (Unity), belirli bir arabirim için döndürdüğü sınıflardan birini oluştururken kullanıcı hakkındaki bilgileri kullanması gerekir. neler oluyorASP.NET MVC Denetleyiciden önce kimlik doğrulaması başlatıldı
, [Yetkilendirme] özelliğinin değerlendirilir önce kontrolör örneğinin oluşturulmasını ve kullanıcı kimlik doğrulaması olmasıdır. Bu, Unity'yi bağımlılık enjeksiyonunu gerçekleştirmeye zorlar ve oturum açmadan önce kullanıcı hakkındaki bilgileri kullanır. Entegre Windows kimlik doğrulaması kullandığımızda bunun hiçbir problemi olmadı, ancak şimdi Azure AD'ye OpenID Connect'i kullanıyoruz ve kullanıcı bilgisi isn ' giriş yapana kadar (kontrol cihazı kapatıldıktan sonra). Orada işlemde önceki kimlik taşımak için benim Owin başlangıç sınıfını yapılandırmak için bir yoldur, ama ben bunun nasıl herhangi örnekler bulamadığını (diğer mesajlar) duydum
. Denetleyicinin başlatılmasından önce gerçekleşmesi gereken kimlik doğrulamasına ihtiyacım var.
[Authorize]
public class MyController : Controller
{
private readonly IMyService myService;
public MyController(IMyService myService)
{
this.myService = myService;
}
// ...
}
Birlik Yapılandırma:
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 Başlangıç (Startup.Auth.cs):
İşte ...Kontrolör sahip olduğumun basitleştirilmiş bir örnek
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);
}
}
});
}
Ben de bu takıldı. Temel denetleyicinin yapıcısında bir kullanıcı gerekiyordu ve 'AuthorizedAttribute' adlı kullanıcının kullanıcıyı harekete geçirmesinden önce çağrılan kurucuyu görmeye şaşırmıştı. –
Neden böyle bir açıklaması http://stackoverflow.com/a/4462767/10245 –