【问题标题】:Invoking webapi throws No Access-Control-Allow-Origin header is present on the requested resource调用 webapi 抛出请求的资源上不存在 Access-Control-Allow-Origin 标头
【发布时间】:2016-11-30 16:41:08
【问题描述】:

我正在尝试按照 Azure 示例通过此处提供的 WSFederation 将 Azure AD 集成到我的 MVC 4.6 Web 应用程序中 https://github.com/Azure-Samples/active-directory-dotnet-webapp-wsfederation

此示例按预期工作。但是,当我在同一个 MVC 项目中添加 WebApi 控制器并使用 [Authorize] 进行装饰时,它会出错。我在这个新添加的 WebApi 控制器中有一个 GET 方法的 ajax 请求。

错误是:

XMLHttpRequest cannot load https://login.microsoftonline.com/85c96496-fbc6-4bf3-bfcc-fb51ca874527/wsfe…UIWNgv-EANzWADAQPCOqF--3c7KGt6G21ucvLkce_wMcwVguKz62ioyGPxQg&wa=wsignin1.0. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://localhost:4279' is therefore not allowed access.

感谢您的帮助!

【问题讨论】:

    标签: azure azure-active-directory ws-federation


    【解决方案1】:

    为 Web API 添加Authorize 标签后,您需要先登录 Web 应用,然后再调用 Ajax 请求此 Web API。然后 Ajax 请求会自动发送 cookie 进行身份验证,并返回正确的结果。

    如果您在登录前向 Web API 调用 Ajax 请求,由于 Web API 受到保护并且 Web 应用正在与 Azure AD 集成,请求将重定向到 Azure AD 的登录页面,这是不允许的跨域请求。这就是这个问题的根本原因。

    【讨论】:

    • 受保护的 webapi 控制器不能像其他(受保护的)MVC 控制器那样自动将用户重定向到登录屏幕吗?
    • 它已经将请求重定向到 Azure AD 的登录页面(如错误消息中提到的链接),但是由于您使用的是 Ajax,因此无法启用用户登录。您可以直接在浏览器中请求 Web API,它将用户重定向到登录页面。
    • 那么我应该如何处理我的场景?我的 Web 应用程序的用户可以通过 ajax 或服务器端 MVC 控制器操作以任何顺序调用 WebApi。我不能强迫他们先使用 MVC 控制器。感谢您的建议。
    • 在这种情况下,您需要先提示用户登录,然后才能使用 Ajax 调用 Web API。例如,您可以在用户登录之前隐藏按钮。
    • 知道了!此外,此示例使用 WS-Fed 令牌的 cookie 存储。是推荐的还是有其他建议的选项?我可以在 MVC 和 WebApi 的标头中传递令牌吗?如果是的话,你能指点我一些演示/文档吗?再次感谢!
    猜你喜欢
    • 2015-10-29
    • 2017-08-17
    • 2017-09-28
    • 2013-11-29
    • 2014-07-28
    • 2014-01-19
    相关资源
    最近更新 更多