我们将集成了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
我们的分析
我们怀疑此问题可能是因为应用程序运行多个实例,并且在登录期间将使用该特定实例建立会话。后续请求将随机转到其他实例,并且实例没有会话信息。当我们只部署应用程序的一个实例时,看不到此错误。
问题
如果这是一个使用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和令牌。棘手和不安全。