我们有使用MEAN堆栈编写的应用程序。 目前,应用程序正在使用本地身份验证。 我们正在尝试使用Azure AD身份验证替换它。
有很好的文章在这里展示了如何使用ADAL.JS库Azure的身份验证配置角度。 这将保护客户端资源。 在示例中,服务器端API使用.Net Web API编写,OWIN用于保护Web API。 因此,OWIN负责验证来自客户端的Bearer令牌发送。
使用MEAN堆栈,服务器端API是用Node.js编写的,那么如果我们切换到Azure AD,我们如何保护Node.js API呢? Microsoft是否提供任何Node模块? 任何一个例子都会很有用。
Microsoft提供了一个护照插件, passport-azure-ad 。
passport-azure-ad是Passport Strategies的集合,可帮助您与Azure Active Directory集成。 它包括OpenID Connect,WS-Federation和SAML-P身份验证和授权。 这些提供程序允许您将Node应用程序与Microsoft Azure AD集成,以便您可以使用其许多功能,包括Web单点登录(WebSSO),Endpoint Protection with OAuth以及JWT令牌颁发和验证。
本文在角度脚本中配置AAD租户信息,这些信息将从客户端公开这些信息,这增加了泄露敏感信息的风险。
您可以考虑存储所有信息,并在Node.js应用程序的后端运行身份验证和授权流程。 并且只为前端角客户端暴露Apis。
您可以参考O365在gitHub上提供的使用ADAL模块的示例。 主要的身份验证和授权流程在https://github.com/OfficeDev/O365-Nodejs-Microsoft-Graph-Connect/blob/master/authHelper.js上编写。
在Node.js的请求中使用访问令牌可以参考https://github.com/OfficeDev/O365-Nodejs-Microsoft-Graph-Connect/blob/master/requestUtil.js
我发现ADAL.js的设计遵循oauth2认证,通过id_token的响应类型。 这意味着它只会暴露tenantId和AAD应用程序clientId,这些不是那么敏感的信息。 并且ADAL.js将在html5 sesstionStorage中存储access_token和几个用户信息。 您可以参考http://www.cloudidentity.com/blog/2015/02/19/introducing-adal-js-v1/和http://www.cloudidentity.com/blog/2014/10/28/adal -javascript-and-angularjs-deep-dive /了解更多信息。
关于ADAL.js用法,您可以使用自己的逻辑通过后端应用程序中的JWT解析访问令牌,您可以参考https://github.com/matvelloso/AADNodeJWT上的示例。
同时,在我看来,您可以将MEAN应用程序分成2个独立的Azure Web应用程序。 一个用于构建Angular App作为前端,另一个用于托管Expressjs Node.js App作为我们整个Web应用程序架构的后端。
在后端Web App服务中,您可以使用Azure Active Directory作为身份验证提供程序来保护Web Apis。 有关详细信息,请参阅https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-how-to-configure-active-directory-authentication/ 。
在前端Web App服务中,您可以在Angular应用程序中使用adal.js
和adal-angular.js
进行身份验证和授权。您可以参考https://github.com/matvelloso/AADNodeJWT的前端部分。
当您成功完成身份验证流程时, adal.js
插件会将adal.js
存储在html5 sesstionstorage
idtoken
中,因此我们可以利用此令牌来请求受AAD保护的后端应用程序:
var token = sessionStorage.getItem('adal.idtoken');
$http.defaults.headers.common.Authorization= 'Bearer '+token;
$http.get('https://<your_backend_apis>').then(function (data){
console.log(data);
})
要使用Azure AD授权Node.js服务器,可以使用node.js中的adal-node库。
以下示例将逐步演示使用Azure AD验证Node.js:
https://code.msdn.microsoft.com/How-to-authorize-Nodejs-fdc580ed