同时使用 Forms Authentication 和 Basic Authentication 保护单个操作

Secure a single action with Forms Authentication & Basic Authentication simultaneously

我的 MVC 应用程序使用 Forms Authentication 进行保护。我有一个应用 AuthorizeAttribute.

的全局过滤器

我有一个名为 Development 的控制器,带有一个名为 Report 的操作。我可以通过以正常方式进行身份验证并转到 http://localhost:8080/Development/Report 来访问此罚款。如果我没有通过身份验证,那么它会将我重定向到表单身份验证登录。

我正在尝试将此页面嵌入到 iOS 应用程序中,以便用户无需手动验证自己即可查看信息。令人困惑的是,iOS 应用程序使用不同的身份验证系统,但它拥有一个设备 ID 和一个唯一令牌,我的 MVC 应用程序也存储了这些令牌。

我想做的是通过表单身份验证和使用基本身份验证的 iOS 应用程序提供报告操作,其中用户名将是 device ID,密码将是token。使用此方法进行身份验证时,用户只能访问 Report 操作,这一点非常重要。在确保一切安全的同时实现这一目标的最佳方式是什么?

我正在考虑使用 AllowAnonymous 属性标记 Report 操作,然后仅为该操作创建自定义身份验证。这是最好的方法吗?

身份验证策略就是:策略。它们不打算混合搭配;您可以选择最适合您的应用程序并使用它。

也就是说,我看到了两条前进的道路。但是,无论哪种方式,都不允许您对所有内容使用相同的操作。最好的办法是将共享代码分解为实用程序 class 或类似的工具。

  1. 将这两个动作放在不同的项目中。然后每个项目都可以实现自己的授权策略。同样,可以将相似的代码提取到实用程序 class 中,在这种情况下,通过两个项目都可以引用的 class 库共享。

  2. 在同一个项目中创建一个单独的操作并且不要在其上使用 Authorize 或者如果它是授权控制器的一部分则使用 AllowAnonymous。这实际上将关闭此操作的标准身份验证并且不提供任何保护。但是,您现在可以腾出时间来手动执行自己的操作 "authorization"。您可以直接在操作中检查设备 ID 和令牌的值,也可以创建一个操作过滤器来执行此操作。您选择哪种取决于您需要执行此操作的频率。如果这是一次性的,您可能只想直接检查操作,因为那样会更快、更容易。但是,如果它是一次性的,您可能仍想使用动作过滤器,以便在它的使用变得更广泛时做好准备。