重定向在ASP.NET MVC SSL动作过滤器循环 [英] Redirect loop with SSL action filter in ASP.NET MVC

查看:158
本文介绍了重定向在ASP.NET MVC SSL动作过滤器循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是ActionFilter(见下文)来检测电流控制器/动作与否1.需要SSL,目前正在使用的2 SSL,并相应地重定向。

这本地工作正常(使用IIS 7的虚拟CERT),但一旦我得到它在服务器上,我得到指示无限重定向循环错误。

任何想法?

 公共类SslFilter:ActionFilterAttribute
{
    公共SslFilter(布尔sslRequired)
    {
        SslRequired = sslRequired;
    }    公共BOOL SslRequired {搞定;组; }
    公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
    {
        HTT prequestBase REQ = filterContext.HttpContext.Request;
        HTT presponseBase解析度= filterContext.HttpContext.Response;        VAR建设者=新UriBuilder(req.Url);        如果(SslRequired&安培;&安培;!req.IsSecureConnection)
        {
            builder.Scheme = Uri.UriSchemeHttps;
            builder.Port = 443;
            res.Redirect(builder.Uri.ToString());        }
        否则,如果(SslRequired&安培;!&安培; req.IsSecureConnection)
        {
            builder.Scheme = Uri.UriSchemeHttp;
            builder.Port = 80;
            res.Redirect(builder.Uri.ToString());
        }        base.OnActionExecuting(filterContext);
    }
}

Firefox的错误:


  

页面没有正确重定向


  
  

火狐已检测到服务器
  被重定向这个请求
  在某种程度上解决这个永远
  完整的。


  
  

此问题有时可以引起
  通过禁用或拒绝接受
  饼干。



解决方案

尝试更MVCish方式重定向:

  VAR建设者=新UriBuilder(req.Url);如果(SslRequired&安培;&安培;!req.IsSecureConnection)
{
    builder.Scheme = Uri.UriSchemeHttps;
    builder.Port = 443;
    filterContext.Result =新RedirectResult(builder.Uri.ToString());
    filterContext.Cancel =真;
}
否则,如果(SslRequired&安培;!&安培; req.IsSecureConnection)
{
    builder.Scheme = Uri.UriSchemeHttp;
    builder.Port = 80;
    filterContext.Result =新RedirectResult(builder.Uri.ToString());
    filterContext.Cancel =真;
}
其他
{
    base.OnActionExecuting(filterContext);
}

I am using an ActionFilter (see below) to detect whether or not 1. the current controller/action requires SSL and 2. SSL is currently being used, and redirect accordingly.

This works fine locally (using a dummy cert in IIS 7) but once I get it up on the server I get an error indicating an infinite redirect loop.

Any ideas?

 public class SslFilter : ActionFilterAttribute
{
    public SslFilter(bool sslRequired)
    {
        SslRequired = sslRequired;
    }

    public bool SslRequired { get; set; }


    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase req = filterContext.HttpContext.Request;
        HttpResponseBase res = filterContext.HttpContext.Response;

        var builder = new UriBuilder(req.Url);

        if (SslRequired && !req.IsSecureConnection)
        {
            builder.Scheme = Uri.UriSchemeHttps;
            builder.Port = 443;
            res.Redirect(builder.Uri.ToString());

        }
        else if (!SslRequired && req.IsSecureConnection)
        {
            builder.Scheme = Uri.UriSchemeHttp;
            builder.Port = 80;
            res.Redirect(builder.Uri.ToString());
        }

        base.OnActionExecuting(filterContext);
    }
}

Firefox error:

The page isn't redirecting properly

Firefox has detected that the server is redirecting the request for this address in a way that will never complete.

This problem can sometimes be caused by disabling or refusing to accept cookies.

解决方案

Try redirecting in a more MVCish way:

var builder = new UriBuilder(req.Url);

if (SslRequired && !req.IsSecureConnection)
{
    builder.Scheme = Uri.UriSchemeHttps;
    builder.Port = 443;
    filterContext.Result = new RedirectResult(builder.Uri.ToString());
    filterContext.Cancel = true;
}
else if (!SslRequired && req.IsSecureConnection)
{
    builder.Scheme = Uri.UriSchemeHttp;
    builder.Port = 80;
    filterContext.Result = new RedirectResult(builder.Uri.ToString());
    filterContext.Cancel = true;
}
else 
{
    base.OnActionExecuting(filterContext);
}

这篇关于重定向在ASP.NET MVC SSL动作过滤器循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆