2017-02-22 19 views
1

Я добавляю Auth0 в простой проект и пытаюсь понять, как работают middlewares.Как выполняются middlewares в ASP.NET Core

В моем Startup.cs у меня есть этот код

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions<AuthSettings> auth0Settings) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    if (env.IsDevelopment()) 
    { 
     app.UseDeveloperExceptionPage(); 
    } 

    app.UseStaticFiles(); 

    // Add the cookie middleware 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true 
    }); 

    // Add the OIDC middleware 
    var options = new OpenIdConnectOptions("Auth0") 
    { 
     // here there are some configurations 
     // ..................... 
    }; 

    options.Scope.Clear(); 
    options.Scope.Add("openid"); 
    options.Scope.Add("name"); 
    options.Scope.Add("email"); 
    options.Scope.Add("picture"); 

    app.UseOpenIdConnectAuthentication(options); 

    app.UseMvc(routeBuilder => 
    { 
     routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}"); 
    }); 
} 

Если я правильно понимаю идею промежуточного слоя в ASP.NET Ядре в нашем примере, если есть печенье присутствует и аутентификация может быть сделана им

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true 
}); 

Прошивка OpenId не будет выполнена.

app.UseOpenIdConnectAuthentication(options); 

Может ли кто-нибудь объяснить мне, как промежуточное программное обеспечение OpenId знает, что оно не должно выполняться?

В нижней части мы имеем

app.UseMvc(routeBuilder => 
{ 
    routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}"); 
}); 

Как он знает, что она всегда должна быть выполнена, но в случае, когда мы спрашиваем некоторый статический файл, который мы не используем MVC.

ответ

4

Каждое промежуточное программное обеспечение в конвейере может выбрать вызов следующего промежуточного программного обеспечения. Причина, по которой вы получаете статические файлы вместо того, чтобы нажимать на контроллер MVC, заключается в том, что статическое промежуточное программное обеспечение файла запрашивает запрашиваемый файл и не хочет вызывать следующее промежуточное программное обеспечение в цепочке. Он просто возвращает файл в качестве ответа.

AutomaticAuthenticate в промежуточном программном обеспечении аутентификации всегда означает «Осмотрите входящий запрос. Если вы найдете что-то, что вас интересует, создайте из него ClaimsPrincipal». В этом случае аутентификация файла cookie автоматически создает принципал для пользователя, который выполнил вход, когда их файл cookie для входа находится в запросе, прежде чем передать запрос следующему промежуточному программному обеспечению.

Простой программный продукт OpenId Connect выполняется на самом деле, но он ничего не делает, потому что он не найдет ничего интересного в запросе, даже если он имел AutomaticAuthenticate = true. Он ищет запросы к своему пути обратного вызова, который по умолчанию устанавливается как CallbackPath = new PathString("/signin-oidc"); в constructor.

Два промежуточных средства аутентификации настроены таким образом, что промежуточное ПО cookie работает всегда, но OpenId Connect только перенаправляет запрос провайдера удостоверений (например, возвращая ChallengeResult с вашего контроллера MVC).

+0

Есть ли у вас какие-либо комментарии связанные с "AutomaticChallenge"? Какое значение имеет значение AutomaticChallenge для true в промежуточном программном обеспечении UseCookieAuthentication? Мои результаты говорят мне, что это свойство не должно быть установлено в true, если у вас есть UseOpenIdConnectAuthentication в конвейере, это связано с тем, что промежуточное ПО OIDC по умолчанию имеет значение AutomaticChallenge равно true. https://github.com/aspnet/Announcements/issues/210 –

+0

AutomaticChallenge просто определяет, должно ли промежуточное программное обеспечение действовать так, как будто ему было предложено запросить вызов, когда запрос несанкционирован. Немного бессмысленно иметь два из них, поскольку только один зарегистрированный ближе к несанкционированному результату (т. Е. Тот, который зарегистрирован позже). Это действительно зависит от вашего специфического использования, которое промежуточное ПО должно быть стандартным. * Обычно * OIDC является значением по умолчанию, так как мы хотим, чтобы пользователь перенаправлялся к провайдеру входа. – juunas