我试图验证我的SPA(angular.js和adal.js(类似于 https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi示例)
我的AD是天蓝色的b2c预览租户。
我可以从我的网站成功登录我的webapi,但不能通过角度从JS SPA登录。
我的设置: Webapi和网站共享相同的clientid(似乎只是这样工作) SPA有自己的clientid,因为否则我得到" api版本不受支持"尝试登录时出错。 我为所有应用程序启用了oauth2AllowImplicitFlow,将spa的应用程序权限授予webapi。 Coap在Webapi和SPA上启用。
我甚至在完成登录后似乎能够获得一个令牌,但是当我尝试拨打我的api时,我得到了拒绝此请求的访问权限。
这应该是这样的吗?我找不到一个如何将b2c与spa以及在不同服务器上运行的api一起使用的示例。
提前致谢
彼得
答案 0 :(得分:6)
官方说它不受微软的支持,但是对github上的实验分支进行了一些修改azure-activedirectory-library-for-js,你可以让它运转起来。
使用第546行adal.js的logOut方法中的policy参数将logout url修复为oauth2协议的v2.0端点:
var urlNavigate = this.instance + tenant + '/oauth2/v2.0/logout?' + logout + (this.config.extraQueryParameter ? '&' + this.config.extraQueryParameter : '');
在adal.js的方法_createUser中永远不会设置username属性。用户名用于续订令牌过程,通过添加以下三行来修复它:
if (parsedJson.hasOwnProperty('emails')) {
user.userName = parsedJson.emails[0];
}
最后,在第146行的adal-angular.js中,使用错误的类型参数调用acquireTokenSilent。此方法仅接受数组类型作为scopes参数,通过将clientId放在数组中来修复它:
_adal.acquireTokenSilent([_adal.config.clientId], null, function (error, tokenOut) {
我已经就github提出了关于此问题的请求,您可以将其用作参考。
在角色初始化adal提供程序时,将你的b2c登录策略放在extraQueryParameter中,如下所示:
adalProvider.init({
tenant: 'tenant.onmicrosoft.com',
clientId: 'clientid',
extraQueryParameter: "p=B2C_1_SignIn"
}, $httpProvider);
答案 1 :(得分:2)
单页应用程序(Javascript)
许多现代应用程序都有单页应用程序(SPA) 前端主要使用Javascript编写,通常使用SPA 框架如AngularJS,Ember.js,Durandal等。这个流程是 尚未在Azure AD B2C预览中提供。
答案 2 :(得分:2)
看起来SPA的AzureAD B2C场景示例代码刚刚在github上发布。见here。
"该示例演示了如何使用Hello.js构建Web应用程序,该应用程序使用Azure AD B2C执行身份管理。该应用程序是一个简单的Web应用程序,可使用登录和signIn-signUp策略执行登录,注册和注销功能,还可以使用EditProfile Policy编辑配置文件。"
注意:在此回答时,功能仍处于"预览"