如何使用 Identity Server 3 保护 Web api
How to secure web api with Identity Server 3
我正在构建一个 MVC 网络应用程序,它使用 openID Connect 混合流程通过 Identity Server 3 进行身份验证。MVC 网络应用程序包含 jQuery 脚本以从 een ApiController 获取异步 JSON 数据.该 ApiController 是同一 MVC 网络应用程序的一部分。
我不希望每个人都能从 API 访问数据,所以我也想保护 API。我向 ApiController 添加了一个 [authorize] 属性。当使用 JQuery ajax 请求 API 时,我收到以下错误消息:
XMLHttpRequest cannot load
https://localhost:44371/identity/connect/authorize?....etc.
Response to preflight request doesn't pass access control check: No
'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'http://localhost:13079' is therefore not allowed
access. The response had HTTP status code 405.
但是,当我直接在浏览器中向 API 方法发出请求时,我将被正确重定向到 Identity Server 的登录页面。
那么,这里的问题到底是什么?我读到一些关于不允许通过 'back-channel' 请求 /authorize 端点的内容,但我不明白 'front-channel' 和 'back-channel' 之间有什么区别。有没有可能我混淆了错误的 OAuth 流程?混合流程可能不是正确的流程吗?
我还发现 API 通常是一个单独的应用程序,但是构建一个单独的 API 应用程序是否总是必要/最佳实践,例如需要不记名令牌?
请为我指出正确的方向。
您需要允许从其他域访问您的 IdentityServer,这是通过允许 "Cross Origin Resource Sharing" 或简称 CORS 来完成的。在 IdentityServer 中,允许这样做的最简单方法是在 Javascript 客户端的客户端配置中,从 IdentityServer docs on CORS:
中查看
One approach to configuing CORS is to use the AllowedCorsOrigins collection on the client configuration. Simply add the origin of the client to the collection and the default configuration in IdentityServer will consult these values to allow cross-origin calls from the origins.
您看到的错误是浏览器告诉您,当它询问 IdentityServer 是否允许来自您的 Javscript 客户端的请求时,它返回的响应基本上是说不,因为来源 (http://localhost:13079) 不是在 "Access-Control-Allow-Origin" 响应 header 中指定。事实上 header 根本不在响应中,这意味着 CORS 未启用。
如果您按照快速入门从文档 here 添加 JavaScript 客户端,那里详细介绍了所有必要的代码,您需要进行客户端配置并设置 IdentityServer 以允许 CORS。
您的身份服务器上的授权方法不允许 ajax 调用。在这种特殊情况下,即使指定 CORS headers 也无济于事。也许你可以 return 禁止响应而不是重定向,并通过 window.location
手动将客户端重定向到所需位置
我正在构建一个 MVC 网络应用程序,它使用 openID Connect 混合流程通过 Identity Server 3 进行身份验证。MVC 网络应用程序包含 jQuery 脚本以从 een ApiController 获取异步 JSON 数据.该 ApiController 是同一 MVC 网络应用程序的一部分。
我不希望每个人都能从 API 访问数据,所以我也想保护 API。我向 ApiController 添加了一个 [authorize] 属性。当使用 JQuery ajax 请求 API 时,我收到以下错误消息:
XMLHttpRequest cannot load https://localhost:44371/identity/connect/authorize?....etc. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:13079' is therefore not allowed access. The response had HTTP status code 405.
但是,当我直接在浏览器中向 API 方法发出请求时,我将被正确重定向到 Identity Server 的登录页面。
那么,这里的问题到底是什么?我读到一些关于不允许通过 'back-channel' 请求 /authorize 端点的内容,但我不明白 'front-channel' 和 'back-channel' 之间有什么区别。有没有可能我混淆了错误的 OAuth 流程?混合流程可能不是正确的流程吗?
我还发现 API 通常是一个单独的应用程序,但是构建一个单独的 API 应用程序是否总是必要/最佳实践,例如需要不记名令牌?
请为我指出正确的方向。
您需要允许从其他域访问您的 IdentityServer,这是通过允许 "Cross Origin Resource Sharing" 或简称 CORS 来完成的。在 IdentityServer 中,允许这样做的最简单方法是在 Javascript 客户端的客户端配置中,从 IdentityServer docs on CORS:
中查看One approach to configuing CORS is to use the AllowedCorsOrigins collection on the client configuration. Simply add the origin of the client to the collection and the default configuration in IdentityServer will consult these values to allow cross-origin calls from the origins.
您看到的错误是浏览器告诉您,当它询问 IdentityServer 是否允许来自您的 Javscript 客户端的请求时,它返回的响应基本上是说不,因为来源 (http://localhost:13079) 不是在 "Access-Control-Allow-Origin" 响应 header 中指定。事实上 header 根本不在响应中,这意味着 CORS 未启用。
如果您按照快速入门从文档 here 添加 JavaScript 客户端,那里详细介绍了所有必要的代码,您需要进行客户端配置并设置 IdentityServer 以允许 CORS。
您的身份服务器上的授权方法不允许 ajax 调用。在这种特殊情况下,即使指定 CORS headers 也无济于事。也许你可以 return 禁止响应而不是重定向,并通过 window.location
手动将客户端重定向到所需位置