【问题标题】:Invoke Forms Authentication for All Requests ASP.Net MVC 5为所有请求调用表单身份验证 ASP.Net MVC 5
【发布时间】:2023-03-09 04:53:01
【问题描述】:

我试图确保任何 URL 的任何请求都会调用表单身份验证模块,并重定向到登录页面。这目前适用于任何具有授权属性的控制器,但不适用于 /Content/site.css 或任何其他 /[Page]

我按照here 的说明进行操作,但没有成功。

总结是,根据我在网上搜索的所有内容,我最终需要从 Web.config 中“modules”元素下的“FormsAuthentication”模块条目中删除“managedHandler”前置条件。我删除了它(以及其他几个仅用于测试的模块,无济于事)。此外,我不在 Web.config 中使用“Authorize”元素,因为这不是 MVC 应用程序的最佳实践,因此我不考虑授权或不授权特定文件路径。

<modules> 
    <remove name="FormsAuthentication" />    
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
    <remove name="FormsAuthenticationModule" />    
    <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />    
    <remove name="UrlAuthorization" />    
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />    
    <remove name="DefaultAuthentication" />    
    <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />    
</modules> 

有什么想法吗?

谢谢。

【问题讨论】:

  • 如果 FormsAuthenticationModule 要检查每个请求是否已通过身份验证,如果未通过则重定向,这与编写自定义 HttpModule 并设置 runAllManagedModulesForAllRequests="true" 有何不同?

标签: asp.net asp.net-mvc forms-authentication iis-8 integrated-pipeline-mode


【解决方案1】:

首先,您可以将Autorize 注册为全局过滤器,这样您的应用程序中的所有操作都需要身份验证和授权(在您希望非授权用户可以使用的操作上使用AllowAnonymous 属性):

public class FilterConfig
{

    public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new System.Web.Mvc.AuthorizeAttribute());                  
    }
}

据我所知,您不需要为此问题修改 modules 配置中的任何内容

现在关于静态内容:

您可以尝试对保存静态文件的文件夹使用位置设置:

<configuration>
  <location path="Content">
    <system.web>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
  </location>
  <location path="Scripts">
      <system.web>
          <authorization>
              <deny users="?"/>
          </authorization>
      </system.web>
  </location>
</configuration> 

P.S 您必须将所有公共静态内容(公共 css 文件和脚本)提取到其他文件夹,因为内容和脚本需要身份验证。

【讨论】:

  • 您好,感谢您的回复,不胜感激。然而,在 MVC 中,使用授权元素是非常不安全和不好的做法,尤其是位置。此外,全局过滤器无法在每个请求上使用 Authorize 属性,只有通过 ASP.Net 管道的操作。这个想法是,任何请求都会触发表单身份验证模块,无论它是否通过 asp.net 管道,IIS 7+ 支持的东西(IIS6 的集成与经典)
  • 我没有说 Authorize 将在每个请求上被调用:“自动作为全局过滤器,这样你的应用程序中的所有操作都需要身份验证和授权” - 正如你在这里看到的那样谈论由托管处理程序执行的控制器操作。
  • “在 MVC 中,使用授权元素是非常不安全和不好的做法,尤其是位置” - 你能提供一些关于它的链接吗?
  • 如果不使用位置,您可以通过托管管道运行所有请求的唯一方法是使用 但不建议这样做,因为可能会出现严重的性能问题。 ..
  • 嗨,亚历克斯,我已经尝试过模块 runAllManagedModulesForAllRequests="true" />,这是准确的,存在性能损失。从我感兴趣的模块中删除 managedHandler 前置条件对于我的用例来说是等效的,没有性能损失,也不起作用。关于全局过滤器,我知道您提到了“所有操作”,但我已经有了,我需要“所有请求”,而不仅仅是控制器操作。
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多