首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅在生产环境中使用ASP.NET MVC RequireHttps

仅在生产环境中使用ASP.NET MVC RequireHttps
EN

Stack Overflow用户
提问于 2009-10-29 03:57:40
回答 11查看 43.5K关注 0票数 121

我想使用RequireHttpsAttribute来防止不安全的超文本传输协议请求被发送到动作方法。

C#

代码语言:javascript
复制
[RequireHttps] //apply to all actions in controller
public class SomeController 
{
    [RequireHttps] //apply to this action only
    public ActionResult SomeAction()
    {
        ...
    }
}

VB

代码语言:javascript
复制
<RequireHttps()> _
Public Class SomeController

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

End Class

不幸的是,HTTPS不支持ASP.NET。

如何使我的ASP.NET MVC应用程序在发布到生产环境时使用RequireHttps,而不是在我的ASP.NET development Server上的开发工作站上运行时使用?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-10-29 04:13:56

如果您在开发工作站上运行发布构建,这将没有帮助,但条件编译可以完成这项工作……

代码语言:javascript
复制
#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中,从技术上讲,属性与它们所应用的定义属于同一行。您不能将条件编译语句放在一行中,因此必须编写两次函数声明-一次使用属性,另一次不使用属性。但是,如果你不介意它的丑陋,它确实起作用了。

代码语言:javascript
复制
#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的建议写的。如果它不起作用,它至少应该传达一般的想法,并给你一个起点。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
<RemoteRequireHttps()> _
Public Class SomeController

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

End Class

干净多了!只要我的未测试代码能正常工作。

票数 129
EN

Stack Overflow用户

发布于 2011-05-03 23:45:08

如果有人需要C#版本:

代码语言:javascript
复制
using System;
using System.Web.Mvc;

namespace My.Utils
{
    public class MyRequireHttpsAttribute : RequireHttpsAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.HttpContext != null && filterContext.HttpContext.Request.IsLocal)
            {
                return;
            }

            base.OnAuthorization(filterContext);
        }
    }
}
票数 65
EN

Stack Overflow用户

发布于 2009-10-29 05:08:11

从RequireHttps派生是一个很好的方法。

为了完全避免这个问题,您也可以在本地计算机上使用IIS和自签名证书。IIS比内置的you服务器更快,而且您的优势在于开发环境更像是生产环境。

Scott Hanselman has a great resource on a few ways to implement local HTTPS with VS2010 and IIS Express.

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1639707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档