使用ADAL JS进行身份验证的行为不符合预期

时间:2016-03-29 01:53:03

标签: javascript azure authentication azure-active-directory adal.js

我在同一目录中有两个Azure AD应用程序,让我们称它们为FrontendAuthBackendAuth,它们分别为ASP.NET MVC前端和Web API后端提供身份验证。 MVC前端使用标准UseOpenIdConnectAuthentication配置进行保护,Web API后端使用UseWindowsAzureActiveDirectoryBearerAuthentication

我想要做的是登录前端,针对FrontendAuth进行身份验证,然后通过JavaScript使用ADAL JS获取的令牌{{1}来消费后端中托管的API }。

假设

我的期望/假设是:

  • 我必须配置BackendAuth才能访问经典门户网站中的FrontendAuth
  • 我必须编辑其中一个或两个的清单文件,以将BackendAuth设置为oauth2AllowImplicitFlow
  • 当我配置true时,我应该将ADAL JS设为clientId
  • FrontendAuth配置的endpoints对象应包含后端API的Url和客户端ID ADAL JS

结果

我可以实现登录前端并通过BackendAuth与后端服务进行通信的目标:

  • ADAL JS应用程序根本无法访问FrontendAuth
  • BackendAuth属性设置为oauth2AllowImplicitFlow
  • 的清单文件都不是
  • trueADAL JS设置为clientId
  • BackendAuth
  • ADAL JS配置的端点对象未设置

问题

根据这些调查结果,我想了解以下内容:

  • 我的假设是否正确?这是ADAL JS的目的吗?
  • 为什么缺少应用程序访问权限和未更改的清单文件对身份验证是否成功没有影响?
  • 这些措施何时会对身份验证结果产生影响?

2 个答案:

答案 0 :(得分:0)

您在这里混合了两个OAuth2流(authorization code flowimplicit flow)。两者都旨在向客户端应用程序发出令牌。 auth代码流用于在服务器上运行的Web应用程序(如MVC应用程序),隐式流程适用于SPA等公共客户端。

使用OpenID Connect使用混合流程将用户登录到MVC应用程序时,您会从浏览器收到授权代码。您可以使用此代码与授权服务器通信并获取JWT令牌,然后将其存储在cookie会话中。您可以使用相同的代码为BackendAuth应用程序获取JWT令牌,只要您已授予FrontendAuth应用程序调用BackendAuth应用程序的权限。

如果要在用户的浏览器中启用JavaScript以调用BackendAuth应用程序,则需要以某种方式将访问令牌传递给浏览器。您可以通过将令牌与初始请求一起发送并将其放在本地存储中或公开(安全)MVC路由来获取令牌来完成此操作。

有关我在此处描述的示例,请参阅this Azure AD sample,它使用授权代码获取Graph API的令牌。

ADAL.js实现隐式流,适用于SPA等JavaScript应用程序。

答案 1 :(得分:0)

听起来您没有使用[Authorize]属性(在类级别或操作级别)显式修饰Web API控制器。因此,您的Web API可能乐意为请求它的任何人提供内容。