考虑一个包含一组使用 ASP.NET 4 和 native C++ IIS 模块构建的 ReST Web 服务的应用程序。
我们需要能够支持 2 种身份验证策略:
内部用户可以直接从另一个客户端应用程序内部调用我们的 ReST 端点(比如用 Silverlight 或 Java 实现),在那里他们已经针对内部单点登录提供商进行身份验证,提供安全 token 作为 HTTP 调用的一部分。
对于测试,我们希望允许用户使用浏览器访问 ReST 端点,因此我们需要允许他们通过输入用户名/密码进行身份验证(我们将检查单点登录提供的网络服务器)。为此,我们正在考虑使用 ASP.NET Forms 或 Digest。
(所以在一种情况下用户已经通过身份验证 - 但我们需要为每次调用验证这一点,在另一种情况下我们需要挑战他们提供凭据)
问题是如何支持这两种情况。
我找不到适用于这两种情况的解决方案:
如果我收到来自应用程序(非浏览器)的调用并且 token 丢失,我无法将它们重定向到 login.aspx,因为调用我们的应用程序不知道如何处理一堆HTML(登录表单)。我需要返回响应代码 401。
但是,如果我接到来自未经过身份验证的 Web 浏览器的调用,我无法在不向用户提供输入其凭据的可能性的情况下返回 401。
有没有人遇到过这个问题?
提前致谢。
附言一些 Web 服务将在 C++ 中实现这一事实使事情变得复杂,但如果我们使用表单例份验证,至少我可以使用集成管道并为 native 模块使用表单。
请您参考如下方法:
我们将使用 HTTP header 实现多种身份验证方案,并且每种客户端类型都将响应其支持的质询。
例如:
- 客户请求资源
- 服务器返回 401 和 WWW-Authenticate:基本,自定义领域:安全区域
- 浏览器可以根据基本访问认证(例如)以凭据响应
- 来自已验证用户身份的其他应用程序内的调用将使用“自定义”身份验证方案提供 token 。
我们还将在 .NET 中创建一个自定义身份验证 HttpModule 实现,它将用于整个网站(包括在 c++ 中实现的应用程序)。
