Аутентификация в ASP.NET Приложение MVC через токен во внешнем виджете (iframe)

#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.