Вопрос или проблема
У нас есть приложение 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 в вашем приложении и устранить возникшие проблемы с перенаправлениями.