使用spa中的azure b2c对webapi进行身份验证(angular和adal.js)

时间:2015-11-28 18:39:50

标签: angularjs azure asp.net-web-api2 adal

我试图验证我的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一起使用的示例。

提前致谢

彼得

3 个答案:

答案 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)

这是not currently supported

  

单页应用程序(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编辑配置文件。"

注意:在此回答时,功能仍处于"预览"