Asp.net web api 如何使用Identity Server 3保护web api

Asp.net web api 如何使用Identity Server 3保护web api,asp.net-web-api,identityserver3,Asp.net Web Api,Identityserver3,我正在构建一个MVC web应用程序,它使用openID连接混合流来通过Identity Server 3进行身份验证。MVCWeb应用程序包含jQuery脚本,用于从een ApiController获取异步JSON数据。该ApicController是同一MVC web应用程序的一部分 我不希望每个人都能从API访问数据,所以我也想保护API。我向ApiController添加了一个[authorize]属性。使用JQuery ajax请求请求API时,我会收到以下错误消息: 无法加载XML

我正在构建一个MVC web应用程序,它使用openID连接混合流来通过Identity Server 3进行身份验证。MVCWeb应用程序包含jQuery脚本,用于从een ApiController获取异步JSON数据。该ApicController是同一MVC web应用程序的一部分

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

无法加载XMLHttpRequest . 对飞行前请求的响应未通过访问控制检查:否 “Access Control Allow Origin”标头出现在请求的服务器上 资源。因此,不允许使用源“” 通道响应的HTTP状态代码为405

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

那么,这里到底有什么问题?我读到一些关于不允许通过“后通道”请求/授权端点的信息,但我不理解“前通道”和“后通道”之间的区别。有可能是我弄错了OAuth流吗?混合流可能不是正确的吗

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


请为我指出正确的方向。

您需要允许从其他域访问您的IdentityServer,这可以通过允许“跨源资源共享”或简称CORS来实现。在IdentityServer中,最简单的方法是在Javascript客户端的客户端配置中实现这一点,请参见:

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

您看到的错误是浏览器告诉您,当它询问IdentityServer是否允许来自Javscript客户端的请求时,它返回的响应基本上是否定的,因为在“Access Control Allow origin”响应头中没有指定源代码()。事实上,响应中根本没有标题,这意味着没有启用CORS


如果您遵循从文档中添加JavaScript客户端的快速启动,那么客户端配置和设置IdentityServer以允许CORS所需的所有必要代码都将在此处详细说明。

您需要允许从其他域访问您的IdentityServer,这是通过允许“跨源资源共享”实现的或者简称CORS。在IdentityServer中,最简单的方法是在Javascript客户端的客户端配置中实现这一点,请参见:

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

您看到的错误是浏览器告诉您,当它询问IdentityServer是否允许来自Javscript客户端的请求时,它返回的响应基本上是否定的,因为在“Access Control Allow origin”响应头中没有指定源代码()。事实上,响应中根本没有标题,这意味着没有启用CORS


如果您遵循从文档中添加JavaScript客户机的快速启动,则客户机配置和设置IdentityServer以允许CORS所需的所有必要代码都将在此处详细说明。

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