具有OpenIDConnect身份验证的ASP.NET MVC在运行多个服务实例时失败

问题描述 投票:1回答:1

我们将集成了AnjularJS的MVC Web应用程序(遗留产品)部署为Web应用程序。我们从AngularJS脚本中公开了ApiControllers的Ajax调用。我们在负载均衡器后面运行了这个应用程序的多个实例。我们最近集成了Azure AD进行身份验证并使用OpenIDConnect流程。用户登录成功但ApiControllers的后续请求(Ajax调用)随机失败,出现“未授权”错误。

OpenIDCOnnect身份验证设置

public void ConfigureAuth(IAppBuilder app)
{
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);       
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        ClientId = "XXXXX",
        Authority = "https://login.microsoftonline.com/xxxx.onmicrosoft.com",
        PostLogoutRedirectUri = @"https://localhost:44360/",
    });
}

然后使用Authorize属性注释每个MVC和API控制器

[Authorize]
public class HomeController : Controller 

我们的分析

我们怀疑此问题可能是因为应用程序运行多个实例,并且在登录期间将使用该特定实例建立会话。后续请求将随机转到其他实例,并且实例没有会话信息。当我们只部署应用程序的一个实例时,看不到此错误。

问题

  1. 当我在线阅读有关Azure AD的内容时,Ajax调用的推荐方法是使用ADAL.js隐式流。由于我们的不是纯粹的单页应用程序,我不确定这是否是一个有效的选择。我们想看看我们是否可以通过坚持OpenIDConnect来解决这个问题。
  2. 有没有办法将此会话信息存储在分布式存储中,以便应用程序的多个实例可以共享它?我在CookieAuthenticationOptions中看到了接口IAuthenticationSessionStore,可以使用它但没有找到有关其用途的足够信息。
asp.net-mvc azure-active-directory openid-connect
1个回答
1
投票

如果这是一个使用MVC应用程序来服务API / AJAX请求的JS应用程序,那么MVC应用程序根本不应该使用cookie。它应该只验证Authorization标头中从JS客户端传递的id_token。您的应用程序失败可能是因为您尝试使用Cookie,在一台服务器上加密它们然后尝试在另一台服务器上使用它们。看看这里:https://docs.microsoft.com/en-us/azure/active-directory/develop/sample-v1-code#single-page-applications,特别是Startup.Auth.cs类的源代码:https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp/blob/master/TodoSPA/App_Start/Startup.Auth.cs

如果您正在将SPA(JS)范例与常规HTML混合使用,那么您将不得不弄清楚如何使用cookie和令牌。棘手和不安全。

© www.soinside.com 2019 - 2024. All rights reserved.