JK.*_*JK. 13 c# ssl requirehttps asp.net-mvc-2
我已经阅读了很多关于ASP.NET MVC的问题[RequireHttps]- 但是找不到这个问题的答案:
[RequireHttps]如果不是https开始,如何使属性将URL切换为https?
我有这个代码:
public ActionResult DoSomething()
{
return View("AnotherAction");
}
[RequireHttps]
public ActionResult AnotherAction()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
但我得到一个错误说:"所请求的资源只能通过SSL访问."
MVC期货项目具有类似的属性[RequireSsl(Redirect = true)].但现在已经过时了...... MVC 2中的等价物是什么?
当有人类型的网址http://example.com/home/dosomething或网址http://example.com/home/anotheraction,我需要他们被自动重定向到http 小号://示例.com /家/ anotheraction
编辑这是一系列事件:
从其他网站调用URL http://example.com/home/dosomething.他们将用户重定向到此网址(使用response.redirect或类似网址).
DoSomething()然后尝试返回AnotherAction(),但失败并显示错误消息"所请求的资源只能通过SSL访问".
Jef*_*ata 22
该RequiresHttps属性会自动尝试重定向到https://your-url.我在我使用该属性的网站上验证了此行为,并查看了Reflector中的代码:
protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException(MvcResources.RequireHttpsAttribute_MustUseSsl);
}
string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url);
}
Run Code Online (Sandbox Code Playgroud)
您确定要将您的网站设置为接受安全连接吗?如果您尝试https://your-url直接浏览会发生什么?
Yak*_*nor 14
[mvc 4]简答:
protected void Application_BeginRequest(Object source, EventArgs e)
{
if (!Context.Request.IsSecureConnection)
{
Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
}
}
Run Code Online (Sandbox Code Playgroud)
更长的答案:
从http移动到https你不能在第一个数据包之后发送重定向到https,
因此你需要使用Application_BeginRequest捕获数据包,
从Global.asax添加函数它将覆盖默认值,
代码应该是类似的东西(类级别的Global.asax):
protected void Application_BeginRequest(Object source, EventArgs e)
{
if (!Context.Request.IsSecureConnection &&
!Request.Url.Host.Contains("localhost") &&
Request.Url.AbsolutePath.Contains("SGAccount/Login"))
{
Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
}
}
Run Code Online (Sandbox Code Playgroud)
我强烈建议设置一个断点并检查Request.Url对象是否有任何与网址相关的需求.
或访问msdn页面混淆request.url absoluteuri vs originalalstring?
我也是你可以去dotnetperls的例子.
此功能使您可以在localhost上进行开发并按原样部署代码.
现在,对于要进行https重定向的每个页面,您需要在if条件中指定它.
要从https移动到http,您可以使用常规的Response.Redirect,如下所示:
if (Request.Url.Scheme.Contains("https"))
{
Response.Redirect(string.Format("http://{0}", Request.Url.Authority), true);
}
Run Code Online (Sandbox Code Playgroud)
请注意,这也支持在本地主机上开发时使用相同的代码,而不是在https添加之前中断原始过程.
我也建议考虑实现一些返回URL约定(如果尚未实现),那么你应该这样做:
if (Request.Url.Scheme.Contains("https"))
{
Response.Redirect(string.Format("http://{0}{1}", Request.Url.Authority, returnUrl), true);
}
Run Code Online (Sandbox Code Playgroud)
这将在登录后重定向到请求的页面.
当然,您应该保护每个显示用户数据,注册,登录等的页面.
| 归档时间: |
|
| 查看次数: |
26830 次 |
| 最近记录: |