ASP.Net核心:在哪里放置app.Use()调用强制HTTPS

时间:2017-01-22 20:49:42

标签: ssl asp.net-core asp.net-core-mvc

我尝试过很多不同的事情,我只是厌倦了把头撞在桌子上。

我正在创建一个ASP.NET Core MVC网站。该网站工作正常,直到我开始尝试在SSL中测试功能。我尝试过以下链接:

第三项继续出现在其他一些链接上,因此我尝试了多种方法来实现这一点。我已将代码设置移动到Startup类的Configure方法的几个位置。如果我将代码段放在app.UseMvc()调用之前的任何位置,我绝对不会:主页(不在SSL下)不会出现,所以我无法关注任何链接。当我在app.UseMvc()调用之后放置它时,使用[RequireHttps]属性的任何方法都会转到“不存在”链接。这有点道理,因为我想使用MVC。但是我该如何测试HTTPS呢?

app.Use(async (context,next)...的代码在哪里?

我当前的Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
            var sslPort = Configuration.GetValue<int>("iisSetting:iisExpress:sslPort");

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });

    app.Use(async (context, next) =>
    {
        if (context.Request.IsHttps)
            await next();
        else
        {
            var sslPortStr = ((sslPort == 0) || (sslPort == 443)) ? string.Empty : ($":{sslPort}");
            var sslUrl = $"https://{context.Request.Host.Host}{sslPort}{context.Request.Path}";
            context.Response.Redirect(sslUrl);
        }
    }); // */
}

更新:(2017/01/26) 我发现如果我在浏览器URL中手动输入SSL端口号,系统会输入SSL / HTTPS ...但它会保留在那里,即使在不需要安全性的页面上也是如此。

我要做的是在URL中显示正确的端口号,而无需手动输入...并且仅用于测试目的。

3 个答案:

答案 0 :(得分:0)

您在配置服务中执行此操作:

services.Configure<MvcOptions>(options =>
{
    options.Filters.Add(new RequireHttpsAttribute());
});

但是如果没有ssl证书,则会失败(404)。 running directly from kestrel与IIS Express不同。使用VS 2015,您可以选中项目属性中的框以使用ssl,它将自动为IIS Express生成自签名证书

答案 1 :(得分:0)

你可以在sudo service mongodb stop sudo rm -rf /var/lib/mongodb/journal/* sudo service mongodb start 之前做你正在做的事情。然后,任何对文件或MVC路由的调用都将被重定向到安全版本。

app.UseStaticFiles();

我刚刚写了一篇关于此的小文章:https://joonasw.net/view/enforcing-https-in-aspnet-core

答案 2 :(得分:0)

您可以在添加mvc时配置它。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.SslPort = 433; // your ssl port no
        options.Filters.Add(new RequireHttpsAttribute());
    });
}