Ускорение локальной разработки с помощью поддельного обработчика аутентификации OpenID

Настройка аутентификации OpenID может быть болезненной в средах разработки, особенно если сервер идентификации недоступен публично или вы все еще ожидаете настройки клиента.

Чтобы решить эту проблему, мы создали локальная схема аутентификации который ведет себя как OpenID, но не требует сетевого подключения или внешней настройки. Он позволяет разработчикам мгновенно войти в систему как фальшивый пользователь с предопределенными ролями — идеально подходит для локального тестирования и удаленной разработки.

Вот упрощенная реализация:

// usings
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System.Security.Claims;
using System.Text.Encodings.Web;
using System.Threading.Tasks;

internal class LocalAuthenticationSchemeOptions : AuthenticationSchemeOptions { }

internal class LocalAuthenticationSchemeHandler(
    IOptionsMonitor options,
    ILoggerFactory logger,
    UrlEncoder encoder)
    : AuthenticationHandler(options, logger, encoder)
{
    protected override async Task HandleAuthenticateAsync()
    {
        var claims = new[]
        {
            // add any claim you need, these are for Optimizely CMS
            new Claim(ClaimTypes.Role, "Admins"),
            new Claim(ClaimTypes.Role, "CmsAdmins"),
            new Claim(ClaimTypes.Role, "CmsEditors"),
            new Claim(ClaimTypes.Name, "John Doe")
        };

        var principal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Local"));
        var ticket = new AuthenticationTicket(principal, Scheme.Name);

        return await Task.FromResult(AuthenticateResult.Success(ticket));
    }
}

Для Optimizely вам необходимо убедиться, что добавленные утверждения соответствуют настройкам вашего приложения, см. https://docs.developers.optimizely.com/content-management-system/docs/virtual-roles.

И подключаем его условно при запуске:

if (environment.IsDevelopment())
{
    services.AddAuthentication("LocalAuthentication")
        .AddScheme(
            "LocalAuthentication",
            opts => { });
}
else
{
    // Your OpenID-implementation, may be services.AddAuthentication...
    services.AddOpenIdServicesConfiguration(configuration, logger);
}

Эта установка означает:

  • Местные разработчики могут войти в систему мгновеннобез OpenID.

  • Полный контроль над идентификацией и ролями пользователей — Тестируйте как любую роль.

  • Нет зависимости от внешних серверовчто делает возможным удаленную/офлайн-разработку.

  • Производство остается безопаснымпоскольку обработчик активен только в Development режим.

Это небольшое дополнение, но оно значительно упрощает рабочие процессы аутентификации во время разработки. Вместо того, чтобы ждать настройки OpenID или туннелирования во внутренние сети, разработчики могут сразу приступить к созданию функций.

Read more:  Один после смерти, другой обвиняется в убийстве

Читайте также

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.