ASP.NET Core Identity с авторизацией через Google

Вопрос или проблема

У нас есть приложение ASP.NET Core с ASP.NET Core Identity, и мы хотим, чтобы пользователи аутентифицировались только через Google (без формы входа).

Мы настроили аутентификацию следующим образом:

services.AddAuthentication(options =>
  {
      options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
      options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
  })
.AddCookie()
.AddGoogle(options =>
{
    options.ClientId = Configuration["Authentication:Google:ClientId"];
    options.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
});

// ....

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

// ....

И вот этот HomeController :

[Authorize]
public class HomeController : BaseController
{
    public HomeController()
    {
    }

    public IActionResult Index()
    {
       return View();
    }
}

Это работает нормально без вызова:

services.AddIdentity<User, Role>()
    .AddErrorDescriber<LocalizedIdentityErrorDescriber>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

Он переходит в Google и проходит аутентификацию, но signin-google, похоже, не может установить куки аутентификации или что-то в этом роде.

Возникает цикл перенаправлений между индексом главной страницы и Google много раз, а затем появляется ошибка:

Произошло необработанное исключение во время обработки запроса.
AuthenticationFailureException: Ошибка корреляции. Неизвестное местоположение

AuthenticationFailureException: При обработке удаленного входа возникла ошибка.

Ответ или решение

Чтобы решить проблему с аутентификацией пользователей через Google в вашем приложении ASP.NET Core с использованием ASP.NET Core Identity, следуйте следующим шагам:

Шаг 1: Конфигурация Identity

Вы уже правильно настраиваете аутентификацию Google. Однако, чтобы аутентификация работала корректно, необходимо добавить поддержку ASP.NET Core Identity. Убедитесь, что у вас есть настройки для User и Role, которые вы можете использовать. Например:

services.AddIdentity<IdentityUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

Шаг 2: Настройка Authentication Challenge

Вы правильно настроили схему аутентификации, но убедитесь, что вы перенаправляете пользователя на страницу входа при отсутствии активной сессии. Добавьте в ваш контроллер метод, который будет инициировать аутентификацию:

public class AccountController : Controller
{
    [AllowAnonymous]
    public IActionResult Login()
    {
        var redirectUrl = Url.Action("Index", "Home");
        var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
        return Challenge(properties, GoogleDefaults.AuthenticationScheme);
    }
}

И не забудьте изменить маршруты, чтобы при неавторизованном доступе пользователя перенаправляло на страницу Login.

Шаг 3: Конфигурация Middleware

Убедитесь, что у вас правильно настроены все middleware в Startup.cs. Ваша конфигурация должна выглядеть примерно так:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

Шаг 4: Проверка конфигурации Google API

Также убедитесь, что в Google Developer Console настроены URI перенаправления. Например, он должен быть чем-то вроде https://localhost:5001/signin-google (или в соответствии с вашим фактическим хостом и портом). Убедитесь, что URI соответствует значению, которое вы указали в конфигурации.

Шаг 5: Обработка ошибок

Обратите внимание на обработку исключений. Если у вас происходят редиректы из-за каких-либо несоответствий в аутентификации, вы можете отследить это в методе Login в вашем контроллере, использовав блоки try-catch для логирования ошибок.

Дополнительная информация

Если все еще есть проблемы с "Correlation failed" ошибкой, это может указывать на проблему с журналированием (cookies) или на то, что браузер не сохраняет информацию сеанса должным образом. Убедитесь, что ваш домен и проект настроены правильно и все ваши cookie настройки заданы верно. Если вы работаете на локальном сервера, попробуйте очистить cookies браузера или использовать режим инкогнито.

Эти шаги помогут вам правильно интегрировать аутентификацию через Google с ASP.NET Core Identity в вашем приложении и устранить возникшие проблемы с перенаправлениями.

Оцените материал
Добавить комментарий

Капча загружается...