【发布时间】:2010-11-25 13:59:25
【问题描述】:
所以我找到了 [RequiresHttps] 属性,但是一旦你进入 https,你就会卡在那里,所以尝试并能够对单个 url(和方案)进行操作,我发现我已经结束了对于不使用 [RequireHttps] 的操作,必须创建自己的 ExtendedController 才能恢复为 http。
只是想知道我正在做的事情是否可以,或者是否有更好的方法?
public class ExtendedController : Controller
{
protected virtual void HandleHttpRequest(AuthorizationContext filterContext)
{
if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("Cannot post between https and http.");
}
string url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url);
}
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
object[] attributes = filterContext.ActionDescriptor.GetCustomAttributes(true);
if (!attributes.Any(a => a is RequireHttpsAttribute))
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.HttpContext.Request.IsSecureConnection)
{
this.HandleHttpRequest(filterContext);
}
}
}
}
【问题讨论】:
-
我刚刚意识到的一件事是我还应该检查 filterContext.IsChildAction - 我想知道在子操作上使用 RequiresHttp 是否有可能遇到相同的问题。似乎在路由端而不是控制器上可能需要更完整的解决方案。
标签: asp.net-mvc