asp.net-mvc - ASP.NET MVC RequireHttps 仅在生产中

标签 asp.net-mvc visual-studio ssl https

我想使用 RequireHttpsAttribute以防止将不安全的 HTTP 请求发送到操作方法。

C#

[RequireHttps] //apply to all actions in controller
public class SomeController 
{
    [RequireHttps] //apply to this action only
    public ActionResult SomeAction()
    {
        ...
    }
}

VB

<RequireHttps()> _
Public Class SomeController

    <RequireHttps()> _
    Public Function SomeAction() As ActionResult
        ...
    End Function

End Class

很遗憾,ASP.NET 开发服务器不支持 HTTPS。

如何让我的 ASP.NET MVC 应用程序在发布到生产环境时使用 RequireHttps,但在 ASP.NET 开发服务器上的开发工作站上运行时却不使用?

最佳答案

如果您在开发工作站上运行发布构建,这将无济于事,但条件编译可以完成这项工作...

#if !DEBUG
[RequireHttps] //apply to all actions in controller
#endif
public class SomeController 
{
    //... or ...
#if !DEBUG
    [RequireHttps] //apply to this action only
#endif
    public ActionResult SomeAction()
    {
    }

}

更新

在 Visual Basic 中,属性在技术上与它们所应用的定义属于同一行。你不能把条件编译语句放在一行中,所以你不得不写两次函数声明——一次有属性,一次没有。不过,如果您不介意丑陋的话,它确实有效。

#If Not Debug Then
    <RequireHttps()> _
    Function SomeAction() As ActionResult
#Else
    Function SomeAction() As ActionResult
#End If
        ...
    End Function

更新2

很多人提到从 RequireHttpsAttribute 派生,但没有提供示例,所以这里为您提供一个。我认为这种方法比条件编译方法更简洁,我更喜欢你的立场。

免责声明:我没有测试过这段代码,哪怕是一点点,而且我的 VB 相当生疏。我所知道的是它编译。我是根据spot、queen3、Lance Fisher的建议写的。如果它不起作用,它至少应该传达总体思路,并给你一个起点。

Public Class RemoteRequireHttpsAttribute
    Inherits System.Web.Mvc.RequireHttpsAttribute

    Public Overrides Sub OnAuthorization(ByVal filterContext As  _
                                         System.Web.Mvc.AuthorizationContext)
        If IsNothing(filterContext) Then
            Throw New ArgumentNullException("filterContext")
        End If

        If Not IsNothing(filterContext.HttpContext) AndAlso _
            filterContext.HttpContext.Request.IsLocal Then
            Return
        End If

        MyBase.OnAuthorization(filterContext)
    End Sub

End Class

基本上,如果当前请求是本地的(也就是说,您正在通过本地主机访问站点),新属性就会退出而不是运行默认的 SSL 授权代码。你可以像这样使用它:

<RemoteRequireHttps()> _
Public Class SomeController

    <RemoteRequireHttps()> _
    Public Function SomeAction() As ActionResult
        ...
    End Function

End Class

干净多了!前提是我未经测试的代码确实有效。

关于asp.net-mvc - ASP.NET MVC RequireHttps 仅在生产中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639707/

相关文章:

c# - 为什么 MVC 5 不调用我的 VirtualPathProvider 类的 GetFile 方法?

visual-studio - Visual Studio 2019 : How to edit menu

ssl - 在 GCP 上使用 NaviServer 配置堡垒主机?

asp.net-mvc - Request.QueryString 在 MVC3 的 _Layout.cshtml 中不起作用

jquery - Telerik MVC 扩展日期选择器未将日期放入文本框中

c - 声明另一个函数时使用函数名和昵称(由 typedef 制成)有什么区别?

c - 1 个主程序中的 2 个功能(Visual Studio 2013)

node.js - "Client network socket disconnected before secure TLS connection was established", Node 10

multithreading - 将 TcpStream + SslStream 分离成读写组件

c# - asp mvc 如何从我的根文件夹中提供图像/文件/视频?