#asp.net-mvc #authentication #iframe #cross-domain #owin
#asp.net-mvc #аутентификация #iframe #междоменный #owin
Вопрос:
У меня есть ASP.NET Приложение MVC (framework 4.7.2) с включенной аутентификацией OWIN. Это приложение является монолитным ERP и работает нормально. У этого приложения есть один ресурс, который предоставляет пользователям отчет html. Теперь одно устаревшее Java-приложение должно иметь доступ к этому ресурсу. Мы разрабатываем виджет (javascript iframe) для использования этого ресурса в этом устаревшем приложении. Виджет использует токен для доступа к приложению MVC. Эти два приложения находятся в разных доменах.
Виджет хорошо работает, когда два приложения находятся в одном домене, но не в разных доменах. После AuthenticationManager.При входе в систему () аутентификация не работает, и пользователь перенаправляется на страницу входа. Если я попытаюсь войти в систему через «страницу входа», это тоже не сработает, поскольку я нахожусь в другом домене и внутри iframe.
Я попытался реализовать это, но это не решило: https://docs.microsoft.com/pt-br/aspnet/samesite/system-web-samesite .
Вот код, который я использовал для аутентификации по токену:
[AllowAnonymous]
public async Task<ActionResult> LoginByToken(string token, string returnUrl)
{
var user = GetUserByToken(token);
if (user != null)
{
await SignInAsync(user);
return RedirectToLocal(returnUrl);
}
else
throw new Exception("The user was not authenticated!")
}
Как я могу заставить его работать? Спасибо за любую помощь!
Примечание: проблема, о которой сообщается ниже, возникает в Chrome и Edge, но не в Firefox.
Ответ №1:
ПРОБЛЕМА РЕШЕНА!!!
Я нашел ответ здесь: https://docs.microsoft.com/pt-br/aspnet/samesite/csmvc
Конфигурация в web.config в моем случае не работала. Мне нужно было изменить CookieAuthentication в частичном запуске класса (/App_Start/Startup.Auth.cs) в методе ConfigureAuth следующим образом:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
//---------------------------------
// It resolve the problem
CookieSameSite = SameSiteMode.None,
CookieHttpOnly = true,
CookieSecure = CookieSecureOption.Always,
//---------------------------------
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
Примечание: «src» в iframe должен быть опубликован в https.