Перенаправление ASP.NET 5/MVC 6 во время событий промежуточного ПО аутентификации
Я хочу создать запись в базе данных и перенаправить пользователя на специальную страницу при первом входе на сайт, независимо от исходного URL-адреса запроса. Последующие входы в систему должны обновить последнее зарегистрированное поле в базе данных.
Я использую внешний источник аутентификации с Cookie Authentication. Кажется интуитивным делать эти вещи во время OnSignedIn
событие для проверки подлинности cookie. Части базы данных этого процесса работают нормально. Проблема с перенаправлением на специальную целевую страницу во время их первого входа.
Вот как настроена проверка подлинности с помощью cookie:
app.UseCookieAuthentication(options =>
{
options.AuthenticationScheme = "Cookies";
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.LoginPath = "/login";
options.AccessDeniedPath = "/access-denied";
options.Events = new CookieAuthenticationEvents
{
OnSignedIn = context =>
{
var userRecord = userService.GetUser(context.Principal.Identity.Name);
if (userRecord == null)
{
userService.CreateUser(context.Principal.Identity.Name);
// Does set a cookie successfully.
context.Response.Cookies.Append("FirstTimeUser", "true");
// Does not redirect but continues on to the originally requested URL.
context.Response.Redirect("/special-first-timer-page");
}
else
{
userService.RecordLogin(userRecord);
}
return Task.FromResult(0);
}
};
});
Я работал над этим, добавив дополнительный компонент промежуточного программного обеспечения и используя тот факт, что я могу установить cookie во время OnSignedIn
событие.
app.Use(async (context, next) =>
{
if (context.Request.Cookies.ContainsKey("FirstTimeUser"))
{
context.Response.Cookies.Delete("FirstTimeUser");
context.Response.Redirect("/special-first-timer-page");
}
await next();
});
app.UseCookieAuthentication(options =>
{
...
options.Events = new CookieAuthenticationEvents
{
OnSignedIn = context =>
{
var userRecord = userService.GetUser(context.Principal.Identity.Name);
if (userRecord == null)
{
userService.CreateUser(context.Principal.Identity.Name);
context.Response.Cookies.Append("FirstTimeUser", "true");
}
else
{
userService.RecordLogin(userRecord);
}
return Task.FromResult(0);
}
};
});
Это работает, но не кажется идеальным. Можно ли успешно перенаправить во время события промежуточного программного обеспечения аутентификации? Я пропускаю точку, даже пытаясь это сделать?