Как запросить аутентификацию у пользовательского промежуточного программного обеспечения в ASP.NET Core 2.0 - PullRequest
0 голосов
/ 11 мая 2018

У меня есть два пользовательских промежуточных ПО ASP.NET Core: одно для аутентификации (которое регистрирует свою собственную схему аутентификации) и второе для какой-то бизнес-работы.

Как я могу использовать промежуточное ПО аутентификации в другом промежуточном ПО? Я легко могу использовать аутентификацию в MVC:

 services.AddMvc(config =>
 {
     var policy = new AuthorizationPolicyBuilder()
                      .RequireAuthenticatedUser()
                      .Build();
     config.Filters.Add(new AuthorizeFilter(policy));
 });

Я также могу предоставить свой собственный AuthenticationSchemeProvider для использования различных схем аутентификации на основе запрошенного URL. Но промежуточное ПО аутентификации работает только для контроллеров MVC. Я хочу, чтобы он работал еще до того, как запустится мое специальное промежуточное ПО. Возможно ли это сделать?

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Это основано на ответе Rython для конкретного случая использования проверки подлинности Windows , но также позволяет разработанным контроллерам использовать другой тип проверки подлинности:

/// <summary>
/// checks if current request resource can be accesses without being Windows-authenticated
/// </summary>
/// <param name="context">http context</param>
/// <returns>true if non-Windows is allowed. Otherwise, false</returns>
public static bool IsAllowedWithoutWindowsAuth(HttpContext context)
{
    bool isAllowedWithoutWindowsAuth = context.Request.Method == "OPTIONS" ||
                                       AllowedControllers.Any(c =>
                                       {
                                           string path = context.Request.Path.ToString();
                                           return path.StartsWith(c, StringComparison.InvariantCulture);
                                       });
    return isAllowedWithoutWindowsAuth;
}

// custom middleware code 
public async Task Invoke(HttpContext context)
{
    // anonymous path, skipping
    if (IsAllowedWithoutWindowsAuth(context))
    {
        await _next(context);
        return;
    }

    if (!context.User.Identity.IsAuthenticated)
    {
        await context.ChallengeAsync("Windows");
        return;
    }

    // other code here
    await _next(context);
 }
0 голосов
/ 14 мая 2018

В пользовательском методе промежуточного программного обеспечения Invoke() вызовите ChallengeAsync(), если пользователь не аутентифицирован: необходимо добавить

public async Task Invoke(HttpContext httpContext, IServiceProvider serviceProvider)
{
    if (!httpContext.User.Identity.IsAuthenticated)
    {
        await httpContext.ChallengeAsync();
    }
    else { /* logic here */ }
}

Пакет NuGet Microsoft.AspNetCore.Authentication.Abstractions.

Над кодом будет выполнятьсяслужба аутентификации по умолчанию для аутентификации пользователя.Если по умолчанию используется пользовательское промежуточное ПО для аутентификации, оно будет вызываться.

...