如何使用Identity Server 3

时间:2017-07-12 10:23:44

标签: asp.net-web-api identityserver3

我正在构建一个MVC Web应用程序,该应用程序使用openID Connect混合流程对Identity Server 3进行身份验证.MVC Web应用程序包含jQuery脚本,用于从een ApiController获取异步JSON数据。 ApiController是同一个MVC Web应用程序的一部分。

我不希望每个人都能够从API访问数据,所以我也希望保护API。我在ApiController中添加了[authorize]属性。当使用JQuery ajax请求请求API时,我收到以下错误消息:

  

XMLHttpRequest无法加载   https://localhost:44371/identity/connect/authorize?....etc。   对预检请求的响应未通过访问控制检查:否   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许来源“http://localhost:13079”   访问。响应的HTTP状态代码为405。

但是,当我直接在浏览器中向API方法发出请求时,我将被正确地重定向到Identity Server的“登录”页面。

那么,这里究竟出现了什么问题?我读到了一些关于通过'back-channel'请求/授权端点是不允许的,但我不明白'front-channel'和'back-channel'之间有什么区别。是否有可能混淆了错误的OAuth流量? Hybrid流量不是正确的吗?

我还发现API通常是一个单独的应用程序,但是构建一个单独的API应用程序(例如需要持票人令牌)是否始终是必要/最佳实践?

请指出我正确的方向。

2 个答案:

答案 0 :(得分:0)

您需要允许从其他域访问IdentityServer,这可以通过允许“跨源资源共享”或简称CORS来完成。在IdentityServer中,允许此操作的最简单方法是在Javascript客户端的客户端配置中,请参阅IdentityServer docs on CORS

  

配置CORS的一种方法是在客户端配置上使用AllowedCorsOrigins集合。只需将客户端的原点添加到集合中,IdentityServer中的默认配置将参考这些值以允许来自源的跨源调用。

您看到的错误是浏览器告诉您,当它询问IdentityServer是否允许来自您的Javscript客户端的请求时,它返回的响应基本上没有,因为原始(http://localhost:13079)未在“Access-Control-Allow-Origin”响应头。事实上,标题不在响应中,意味着CORS未启用。

如果您按照快速入门从文档here添加JavaScript客户端,那么您需要详细说明客户端配置和设置IdentityServer以允许CORS的所有必要代码。

答案 1 :(得分:0)

身份服务器上的授权方法不允许ajax调用。在这种特殊情况下,即使指定CORS头也无法帮助您。也许您可以返回禁止响应而不是重定向,并通过window.location手动将客户端重定向到所需位置