【问题标题】:MVC RequireHttps Attribute is worthless?MVC RequireHttps 属性一文不值?
【发布时间】:2013-01-03 16:45:14
【问题描述】:

我需要允许用户通过我的 asp.net MVC 应用程序中的表单更改他们的密码。我的第一个想法是用 RequireHttps 属性装饰 ChangePassword 操作。

但是,在属性启动并返回“请求的资源只能通过 SSL 访问”之前,我仍然必须发送未加密的密码。这违背了目的,不是吗?

我确定我只是感到困惑,RequireHttps 很有用;我想知道是否有办法使用 RequireHttps 来实现我的目标。或者,我想知道任何其他方式来实现它。

更新:

由于下面的答案,我现在有了一些选择 - 我可以使用 https 在 iframe 中加载密码输入,这意味着来自它的任何帖子都将被加密。否则,我可以在构造帖子 url 的代码中将协议设置为 https:

var url = '@Url.Action("changePassword", "Security", new { area = "" }, "https")'

我不确定哪个更好,但我会尝试第二个 - 欢迎任何 cmets。

【问题讨论】:

  • 确保该表单的所有链接都以 https:// 开头?
  • +1 @MichaelDunlap。只需要求您的网站从被用户点击的第一刻起就使用 HTTPS,然后不用担心安全或不安全的信息......您的用户可能会希望他们与您的网站的所有交互都能够通过您似乎正在尝试进行复杂的来回切换。

标签: asp.net-mvc security razor https custom-attributes


【解决方案1】:

您的应用程序无法控制是否启用 SSL。这仅取决于 Web 服务器配置。您唯一能做的就是确保您的应用程序不信任未在线加密的数据。 RequireHttps 就是这样做的。使用此属性修饰的操作将永远不会处理以纯文本形式发送的数据。

【讨论】:

【解决方案2】:

RequireHttpsAttribute 的真正用例是仅在请求身份验证时强制执行https:// 方案。并非在所有情况下。 RequireHttpsAttribute只实现了IAuthenticationFilter接口的OnAuthentication方法。

由于仅在 InvokeAuthenticationFilters 方法中调用 OnAuthentication 方法,因此我不会使用 RequireHttpsAttribute 属性。

为了在某些控制器或操作上正确执行https://,我将根据ActionFilterAttribute 创建自己的属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class EnforceHttpsActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (new[] { "GET", "HEAD" }.Any(verb => String.Equals(filterContext.HttpContext.Request.HttpMethod, verb, StringComparison.OrdinalIgnoreCase))) ;
        {
            string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
            filterContext.Result = new RedirectResult(url);
        }
    }
}

要对整个网站强制执行https://,您可以从我用于示例应用的*.azurewebsites.net 实例的web.config markup 获得启发。

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="HTTPS Redirect in Azure">
          <match url="(.+)" />
          <conditions>
            <add input="{HTTPS}" pattern="^OFF$" />
            <add input="{HTTP_HOST}" pattern="^(.+)\.azurewebsites.net(.*)$" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="SeeOther" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

【讨论】:

    【解决方案3】:

    注意:[RequireHttps] 属性不处理 HEAD 请求 - 而是给出异常,因此某些蜘蛛程序或预取工具在尝试访问您的网站时会出错。

    无论如何,最好在 IIS 中使用 rewrite module 执行类似的操作。

        <rule name="Redirect to http" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
            <match url="*" negate="false" />
            <conditions logicalGrouping="MatchAny">
                <add input="{HTTPS}" pattern="off" />
            </conditions>
            <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Found" />
        </rule>
    

    取自这里:https://blogs.technet.microsoft.com/dawiese/2016/06/07/redirect-from-http-to-https-using-the-iis-url-rewrite-module/

    重要提示:不要忘记在迁移到新服务器时重新安装重写模块 - 如果您忘记了,您得到的错误有点迟钝!

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 2023-03-19
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多