我正在将asp.net应用程序转换为mvc3。假设我有一个需要https的登录页面,而且每个其他页面只需要http我如何将登录重定向到https并将所有其他页面保留在http?
任何建议都会很棒!
答案 0 :(得分:14)
RequireHttpsAttribute
课程可能就是你想要的。
[RequireHttps]
public ActionResult SignIn() {
return View();
}
答案 1 :(得分:4)
我喜欢这个解决方案,因为: 1.因为你永远不必在VS中再次触摸它。装饰器本身会导致浏览器甚至在调试时以https呈现网站。
如果你将它实现到一个基本控制器并让你的所有控制器继承自那个控制器,你知道后面没有滑倒“可以这么说”。
#if !DEBUG
#define RELEASE
#endif namespace ProjectName.UI.Controllers {
using System.Web.Mvc;
#if RELEASE
[RequireHttps]
#endif
public abstract partial class ProjectNameBaseController : Controller
{
}
}
答案 2 :(得分:4)
我和我的同事看着这个并相信我们找到了一个很好的解决方案。以下是我们提出的建议:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class HttpsRequiredAttribute : RequireHttpsAttribute
{
protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
// Check to see if we're secure
string requirestr = ConfigurationManager.AppSettings["RequireHttps"];
bool require;
if (bool.TryParse(requirestr, out require) && require)
base.HandleNonHttpsRequest(filterContext);
}
}
这可以通过扩展RequireHttpsAttribute来实现,并且可以应用于类或方法,如AttributeTargets所示。然后我们覆盖RequireHttpsAttribute中的虚函数。该方法的作用是检查Web.config文件中是否有一个名为“RequireHttps”的键。如果它找不到它,或者它是一个无效的bool值(这是bool.tryparse检查的),那么它不需要Https。如果它发现值为true,则它需要HTTPS。
如果您使用此扩展程序,则需要在Web.config中添加名为“RequireHttps”的密钥,如下所示:
<add key="RequireHttps" value="true"/>
然后,您可以通过在调试时更改此变量来关闭Https的要求,或者通过更改Web.config文件以在站点部署的任何位置满足要求。
答案 3 :(得分:2)
问题是,登录后,即使您不想要,所有请求都将成为https