Добавление проверки в процесс входа в ASP Core MVC - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть приложение ASP Core MVC, которое использует AD аутентификацию, которая работает хорошо.Я хочу добавить дополнительный шаг к входу в систему, после того как пользователь аутентифицирован в AD, я хочу проверить, авторизован ли пользователь в базе данных, поскольку мое приложение может использоваться только авторизованными и авторизованными пользователями.

Это хочу, чтобы у меня был сейчас файл Startup.cs:

        // Authentication:
        services.AddAuthentication(sharedOptions =>
        {
            sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddAzureAd(options =>
        {
            Configuration.Bind("AzureAd", options);
            AzureAdOptions.Settings = options;
        })
        .AddCookie(options =>
        {
            options.EventsType = typeof(CustomCookieAuthenticationEvents);
        });

Я реализовал пользовательский класс для переопределения входа:

public override async Task SigningIn(CookieSigningInContext context)
    {
        var email = context.Principal.Claims.FirstOrDefault(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress")?.Value;

        // Verifies if the user is configured on the database, if it's not access must be denied.
        try
        {
            var user = _managementDbContext.Users.Single(u => u.Email == email);

            // Add tenant and role information to the claims list
            context.Principal.Claims.Append(new Claim("organization", user.Tenant.Name));
            context.Principal.Claims.Append(new Claim("role", user.Role.Name));

            await base.SigningIn(context);
        }
        catch (InvalidOperationException)
        {
            //TODO redirect to another page
        }
    }

Когда я запускаю код (которыйбаза данных настроена на возврат ошибки и неудачную аутентификацию) поток попадает в исключение, но cookie-файл аутентификации создается в любом случае.

Я ожидал, что смогу предотвратить это.Мне интересно, переопределяю ли я правильное событие.

Заранее спасибо.

PS: я использую .NET Core 2.2

1 Ответ

1 голос
/ 07 апреля 2019

Событие CookieAuthenticationEvents.SigningIn на самом деле не полезно для прерывания процесса входа. Не существует механизма, который его останавливает, и даже если вы установите результат перенаправления в HttpContext, оставшаяся часть CookieAuthenticationHandler все равно установит куки-файл аутентификации.

Лучшим вариантом является предотвращение вызова схемы cookie для полного входа в систему. Таким образом, вы хотите подключиться к процессу раньше, чтобы провалить вызов, возникающий в AzureAD и базовой схеме OpenID Connect.

Используйте событие TicketReceived схемы OIDC, чтобы подключиться к процессу непосредственно перед входом в систему. На этом этапе пользовательский принципал полностью построен, поэтому вы можете получить доступ ко всем его свойствам. А затем просто подтвердите этого пользователя и, соответственно, завершите его, если пользователь не должен входить в систему.

Примерно так (не проверено):

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAd(options =>
{
    Configuration.Bind("AzureAd", options);
});

services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    // TicketReceived event is called when the authentication process
    // is completed but right before the SignIn happens
    options.Events.OnTicketReceived = async (context) =>
    {
        var user = context.Principal;

        userValidator = context.HttpContext.Services.GetService<IUserValidator>();
        var isValid = await userValidator.ValidateUser(user);

        if (!isValid)
        {
            context.Fail("User is not allowed");
            context.Response.Redirect("/error/user-not-allowed");
            return;
        }

        context.Success();
    };
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...