Startup.cs 安全措施

Startup.cs security measures

我想知道我是不是
(a) 参与良好的编码实践,
(b) 无害地重复我自己,或者
(c) 增加低效冗余

例如:
1)在 Configure() 我可以添加 RewriteOptions().AddRedirectToHttps();
2)在 ConfigureServices() 我可以添加 services.Configure<MvcOptions>(options => { options.Filters.Add(new RequireHttpsAttribute()); });

另一个例子:
1) 在 Configure() 中我可以添加 app.UseAuthentication();
2) 在 ConfigureServices() 中,我可以将 .RequireAuthenticatedUser() 添加到我的 AddMvc() 调用中。

在这两个示例中,似乎 我只需要一个电话就可以逃脱。我是否可以自由而明确地只保留一个电话?如果是这样,保留哪个更好?

我进行了相当多的搜索,可以看到所有这些方法都在使用中,但是我还没有找到可以比较这些调用的相对优点的资源,更不用说指出它是好还是坏的做法了一起使用。

以你的第一个例子为例:

1) In Configure() I can add RewriteOptions().AddRedirectToHttps();

2) In ConfigureServices() I can add services.Configure<MvcOptions>(options => { options.Filters.Add(new RequireHttpsAttribute()); });

这两个实现本质上相同的事情——它们将 HTTP 请求重定向到 HTTPS。不同之处在于它们适用于哪些请求。

如果您使用重写器中间件,所有到达中间件的请求都将被重定向到 HTTPS。

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // Requests handled by this middleware won't be redirected to HTTPS

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options); // All requests that make it this far will be redirected from HTTP to HTTPS

    app.UseMvc(); // Requests guaranteed to be HTTPS
}

在第二种情况下,您使用全局过滤器来应用 RequireHttpsAttribute,只有到达 MvcMiddleware 的请求才会被重定向到 HTTPS。

就最佳实践而言,我建议使用重写器中间件 - 您可以将它添加到中间件管道的开头,然后您的所有请求都需要通过 HTTPS,而不仅仅是将其发送到的请求MVC中间件。


在你的第二个例子中,这两种方法实际上做了不同的事情:

  • app.UseAuthentication() - 验证请求,并通过例如设置与请求关联的 User反序列化存储在 cookie
  • 中的用户主体
  • RequireAuthenticatedUser() - 要求用户在调用控制器上的操作方法之前登录。如果用户还没有登录,他们将被重定向到登录页面。在这种情况下,您必须app.UseMvc()之前调用app.UseAuthentication(),否则即使您已经登录,请求的User也不会被设置,您将被重定向到登录页面。