2017-05-31 96 views
1

我在Azure中拥有多个应用程序的租户。我正在使用OpenID Connect进行授权。在login.microsoft.com openid-configuration中,提供了一个end_session_endpoint URL。文章解释了如何发送注销请求。这将在Azure结束会话,但不会在我的客户端(Angular2 SPA)结束。要做到这一点,我使用angular-oauth2-oidc和下面的代码:在Azure AD中使用CORS问题OpenID Connect在Angular应用程序中注销

this.http.get('https://login.microsoftonline.com/TENANT_ID/oauth2/logout",') 
    .toPromise() 
    .then(function() { 
     this.oauthService.logOut(); 
    } 
); 

的GET来login.microsoftonline.com将结束服务器上的会话和呼叫logOut()将在本地结束会话。当我运行它,我得到以下错误:

XMLHttpRequest cannot load https://login.microsoftonline.com/TENANT_ID/oauth2/logout . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:51518 ' is therefore not allowed access.

当我检查从login.microsoftonline.com得到的回应,Access-Control-Allow-Origin不响应头之一。我很惊讶,它不会有与*作为价值的头。无论如何,我该如何解决这个问题?我发现应用程序服务中存在CORS设置,并且我已将本地主机(当前正在本地测试)添加到CORS中的租户中的其中一个应用程序,但它仍不起作用。

暂时,我在我的应用程序API上添加了一个API端点,它在C#中调用login.microsoftonline.com URL,但这很麻烦。我想通过javascript来完成。

回答

0

您需要将浏览器重定向到URL。你不能通过AJAX调用它。

You must also redirect the user to the end_session_endpoint for sign-out.

Azure AD不允许在登录端点上进行跨域调用,并且您无法更改该设置。

您可以将用户重定向到:

https://login.microsoftonline.com/ccb87602-82bf-4f35-b7d2-aa‌​aaaaaaaaaa/oauth2/lo‌​gout?post_logout_red‌​irect_uri=https%3a%2‌​f%2fsitename.azurewe‌​bsites.net%2fHome%2f‌​SignedOut 

post_logout_redirect_uri参数允许您指定用户的浏览器应重定向注销后。这样用户不会丢失上下文。确保在重定向之前在用户的应用程序一侧保存用户的工作,以免生气的用户。

+0

我在文档中读到的措辞是“你**可以**简单地将用户重定向到end_session_endpoint”,这意味着这是一种选择。当您重定向到端点时,它确实会结束您的会话,但会丢失您正在使用的租户/应用程序的上下文。因此,如果用户注销或者您明确结束了用户的会话(例如不活动的B/C),则返回应用程序的唯一方式(当然,这需要重新进行身份验证)将是手动输入在应用的网址中这是一个非常糟糕的用户体验。 – im1dermike

+0

您可以在参数中指定后期注销重定向URI。然后,用户将在退出后重定向到您的应用。 – juunas

+0

以下是一个示例网址:https://login.microsoftonline.com/ccb87602-82bf-4f35-b7d2-aaaaaaaaaaaa/oauth2/logout?post_logout_redirect_uri = https%3a%2f%2fsitename.azurewebsites.net%2fHome%2fSignedOut' 。 – juunas

相关问题