Angular 2/4 adal-angular4活动目录对API问题

时间:2017-08-02 17:15:23

标签: angular servicestack azure-active-directory adal

我一直在按照此示例从angular(4)应用程序访问azure活动目录:https://github.com/benbaran/adal-angular4-example

我可以对AD进行身份验证,但之后我想对在AD中注册的API / APP进行后续调用。

我尝试过使用这个例子:

public CallAPI() {
  let headers = new Headers({ 'Content-Type': 'application/json' });
  var token;

  this.service.acquireToken("{client id}").subscribe(p => {
    token = p;

    headers.append("Authorization", 'Bearer ' + token);

    let options = new RequestOptions({ headers: headers });
    // Make the HTTP request:
    this.httpClient.get('https://localhost:45678/stuff', options).subscribe(data => {
      // Read the result field from the JSON response.
      this.results = data['results'];
      console.log(data);
    });

  }, (error => {
    console.log(error);
  }));
}

我遇到的第一个问题是CORS错误。我在localhost上运行客户端应用程序:并获取:

  

XMLHttpRequest无法加载https://localhost:45678/stuff。从' https://localhost:45678/stuff'重定向到' https://login.microsoftonline.com/ ..........'被CORS政策阻止:No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' https://localhost:4200'因此不允许访问。

我尝试访问的app / API也在本地运行(客户端和服务器都是https)

它们都是活动目录中的注册应用程序,其登录/应用程序ID uris设置为各自的本地主机地址。

app / api使用服务堆栈,因此设置:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
  new WindowsAzureActiveDirectoryBearerAuthenticationOptions
  {
    TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
    {
      ValidAudience = Audience
    },
    Tenant = Domain
  });

public override void Configure(Container container)
{
  AddPreRequestFilters();
  AddErrorResponseFilters();

  this.Plugins.AddRange(ServiceConfiguration.GetPlugins());
  this.Plugins.Add(new SwaggerFeature());
  this.Plugins.Add(new CorsFeature(allowedHeaders: "Origin, X-Requested-With, Content-Type, Accept, Authorization", allowCredentials: true));
  ServiceConfiguration.Configure(container);

}

为了绕过CORS错误,我使用了Allow-Control-Allow-Origin chrome扩展程序,使用此扩展程序,我得到一个OPTIONS请求,然后是302(到我的' stuff'端点),其中包含我的授权:{{1标头。最后有一个OPTIONS和GET(带有auth头)登录.microsoft.com /..../ oath2 ...

总是无法登录。

我的ADAL配置如下所示:

Bearer {token}

我有什么明显的遗失吗?我也尝试使用endpoints属性绕过acquireToken步骤无效:

const config: adal.Config = {                          
  tenant: 'xxxx.onmicrosoft.com',            
  clientId: 'xxxxxxxxxxxxxx',   // client id of AD app
  redirectUri: 'https://localhost:4200/', // the angular app
  cacheLocation: 'localStorage'

}

1 个答案:

答案 0 :(得分:1)

我们(我们的高级开发人员)在登录AD(adal4.service.js)后尝试访问已注册的API时发现了一些问题

首先在handleWindowCallback中,在我们的情况下,requestType始终设置为UNKNOWN,因此状态匹配始终为false。

这里有点黑客攻击:

if(requestInfo.requestType === 'UNKNOWN') {
requestInfo.requestType = this.adalContext.REQUEST_TYPE.RENEW_TOKEN;
requestInfo.stateMatch = true;
}

我们还必须改变这个:

else if (requestInfo.requestType === 
this.adalContext.REQUEST_TYPE.RENEW_TOKEN) {
this.adalContext.callback = 
window.parent.callBackMappedToRenewStates[requestInfo.stateResponse];
}

到此:

else if (requestInfo.requestType === 
this.adalContext.REQUEST_TYPE.RENEW_TOKEN) {
this.adalContext.callback =
window.parent.callBackMappedToRenewStates[
decodeURIComponent(requestInfo.stateResponse)];
}

stateResponse中的url已编码(百分比符号等),因此永远不会匹配,使回调为null。

希望这有助于某人 - 也许找到更好的解决方案!

这是叉子:adal-angular4