好的,我们可以使用RequireHttpsAttribute
来确保只能通过SSL调用控制器/控制器方法。在我们尝试通过HTTP命中方法的情况下,服务器向同一控制器(方法)的HTTPS版本发出302。
这对我的用户来说意味着首先不安全地发出第一个请求是可以接受的。我不认为这是可以接受的。在我推出一个在HTTP版本被命中的情况下发出404/500状态代码的属性之前,这样的属性是否已经存在?
答案 0 :(得分:2)
在我推出一个发布404/500状态代码的属性之前 遇到HTTP版本的情况,已经有了这样的属性 存在?
不,这样的属性不是现成的。
答案 1 :(得分:1)
如果使用HTTP请求页面的简单行为不会影响任何用户数据,我会说重定向应该足够并且是您的方案的完美方法。为什么要打扰用户我们可以照顾的事情?
答案 2 :(得分:1)
这意味着我的用户可以发布第一个 首先请求不安全。我不觉得这是 可以接受的。在我小跑出一个发布404/500的属性之前 在HTTP版本被命中的情况下的状态代码,这样做 属性已存在?
如果您不希望自己的应用程序使用http://
代替https://
来处理这些网址,请不要提供任何内容(404或无连接)。
请注意,ultimately the user's responsibility检查是否使用了SSL / TLS(并且正确使用了有效证书)。确保指向这些地址的链接确实使用https://
,并且用户期望使用https://
,至少在起始页面上使用http://
。您可以考虑使用HSTS,如果他们的浏览器支持它(或者可能永久重定向到将被缓存的入口点)。
来自另一条评论:
我不希望任何关于以任何方式泄露给任何第三方的网址的信息
使用来自客户端的此https://
URL进行请求后,在服务器上执行任何操作都没有意义。现在为时已晚:窃听者可以看到这个请求。 (如果您自己的页面没有链接到外部网站,他们也不会在引荐来源中看到该地址。)
即使您的服务器甚至不在普通HTTP端口上侦听,活动的MITM攻击者(或更简单地说,代理)也可能会侦听该请求并获取URL,而不会到达您的服务器。
再次:确保您的用户希望使用https://
,并且一旦他们进入安全页面,请确保您对网站其他部分的链接/表单操作都使用{{1}}。
答案 3 :(得分:0)
所以作为参考,这是我的新属性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
Inherited = true,
AllowMultiple = false)]
public class HttpsOnlyAttribute : FilterAttribute, IAuthorizationFilter
{
private readonly bool disableInDebug;
public HttpsOnlyAttribute(bool disableInDebug = false)
{
this.disableInDebug = disableInDebug;
}
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
#if DEBUG
if (disableInDebug) return;
#endif
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
var context = filterContext.HttpContext;
var request = context.Request;
var isSecure = request.IsSecureConnection;
if (!isSecure)
{
throw new HttpException(404, "Not found");
}
}
}