ASP.NET MVC:如何在localhost上自动禁用[RequireHttps]?

Ale*_*lex 28 iis debugging asp.net-mvc ssl localhost

我希望我的登录页面只是SSL:

    [RequireHttps]
    public ActionResult Login()
    {
        if (Helper.LoggedIn)
        {
            Response.Redirect("/account/stats");
        }

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

但显然,当我开发和调试我的应用程序时,它无法在localhost上运行.我不想将IIS 7与SSL证书一起使用,如何自动禁用RequireHttps属性?

更新

基于StackOverflow用户和ASP.NET MVC 2源代码提供的信息,我创建了以下类来解决问题.

public class RequireSSLAttribute : FilterAttribute, IAuthorizationFilter
{
    public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (!filterContext.HttpContext.Request.IsSecureConnection)
        {
            HandleNonHttpsRequest(filterContext);
        }
    }

    protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.Url.Host.Contains("localhost")) return;

        if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("The requested resource can only be accessed via SSL");
        }

        string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
        filterContext.Result = new RedirectResult(url);
    }
}
Run Code Online (Sandbox Code Playgroud)

它的使用方式如下:

[RequireSSL]
public ActionResult Login()
{
    if (Helper.LoggedIn)
    {
        Response.Redirect("/account/stats");
    }

    return View();
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*hao 26

最简单的方法是从RequireHttps派生一个新属性并覆盖HandleNonHttpsRequest

protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
        {
            if (!filterContext.HttpContext.Request.Url.Host.Contains("localhost"))
            {
                base.HandleNonHttpsRequest(filterContext);
            }
        }
Run Code Online (Sandbox Code Playgroud)

HandleNonHttpsRequest是抛出异常的方法,如果主机是localhost,我们所做的就是不调用它(正如杰夫在他的评论中所说,你可以将它扩展到测试环境或实际上你想要的任何其他异常).

  • 您可以使用filterContext.HttpContext.Request.IsLocal而不是搜索字符串 (2认同)

小智 19

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) {

        if (!HttpContext.Current.IsDebuggingEnabled) {
            filters.Add(new RequireHttpsAttribute());
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 在我当前的MVC项目中,App_Start文件夹中有一个名为FilterConfig.cs的默认文件.把它添加到那里. (4认同)
  • 添加一些关于在何处放置此代码的信息会更有帮助,只是为了帮助那些对ASP.NET MVC更不熟悉的人. (3认同)

Fem*_*ref 14

#if (!DEBUG)
[RequireHttps]
#endif
public ActionResult Login()
{
    if (Helper.LoggedIn)
    {
        Response.Redirect("/account/stats");
    }

    return View();
}
Run Code Online (Sandbox Code Playgroud)

  • 我也想过这个.但这意味着我必须为每个RequireHttps属性添加#if DEBUG. (2认同)

jos*_*rry 8

您可以将此要求封装在派生属性中:

class RequireHttpsNonDebugAttribute : RequireHttpsAttribute {
    public override void HandleNonHttpsRequest(AuthorizationContext ctx) {
        #if (!DEBUG)
        base.HandleNonHttpsRequest(ctx);
        #endif
    }
}
Run Code Online (Sandbox Code Playgroud)