Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl ASP.Net核心:将app.Use()调用放置在何处以强制HTTPS_Ssl_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

Ssl ASP.Net核心:将app.Use()调用放置在何处以强制HTTPS

Ssl ASP.Net核心:将app.Use()调用放置在何处以强制HTTPS,ssl,asp.net-core,asp.net-core-mvc,Ssl,Asp.net Core,Asp.net Core Mvc,我尝试过很多不同的事情,只是厌倦了把头撞在桌子上 我正在创建一个ASP.NET核心MVC网站。在我开始尝试在SSL中测试功能之前,该站点运行良好。我尝试了以下链接: 第三个项目不断出现在许多其他链接上,因此我尝试了多种方法使其工作。我已经将代码设置移到启动类“Configure方法”的几个位置。如果我将代码段放在app.UseMvc()调用之前的任何位置,我将一无所获:主页(不在SSL下)不会出现,因此我无法跟踪任何链接。当我将它放在app.UseMvc()调用之后时,任何使用[Req

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

我正在创建一个ASP.NET核心MVC网站。在我开始尝试在SSL中测试功能之前,该站点运行良好。我尝试了以下链接:

第三个项目不断出现在许多其他链接上,因此我尝试了多种方法使其工作。我已经将代码设置移到启动类“
Configure
方法”的几个位置。如果我将代码段放在
app.UseMvc()
调用之前的任何位置,我将一无所获:主页(不在SSL下)不会出现,因此我无法跟踪任何链接。当我将它放在
app.UseMvc()
调用之后时,任何使用
[RequireHttps]
属性的方法都会转到“不存在”链接。这是有道理的,因为我想使用MVC。但是我如何测试HTTPS呢

app.Use的代码在哪里使用(异步(上下文,下一步).
go

我当前的
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);
        }
    }); // */
}
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
loggerFactory.AddConsole(Configuration.GetSection(“Logging”);
loggerFactory.AddDebug();
var sslPort=Configuration.GetValue(“iisSetting:iisExpress:sslPort”);
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
其他的
{
app.UseExceptionHandler(“/Home/Error”);
}
app.UseStaticFiles();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
应用程序使用(异步(上下文,下一步)=>
{
if(context.Request.IsHttps)
等待下一个();
其他的
{
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中显示正确的端口号,而无需手动键入它们…并且仅用于测试目的。

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

services.Configure<MvcOptions>(options =>
{
    options.Filters.Add(new RequireHttpsAttribute());
});
services.Configure(选项=>
{
options.Filters.Add(新的requireHttpAttribute());
});

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

您可以执行之前的操作
app.UseStaticFiles();
。然后对文件或MVC路由的任何调用都将重定向到安全版本

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);
    }
});
app.UseStaticFiles();

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

我也写了一篇关于这方面的小文章:。

您可以在添加mvc时配置它

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

当我这样做的时候,我得到了HTTP 404。对不起。出于某种原因,我无法编辑上一篇文章。我在移动应用程序时在主页上得到了HTTP 404。在app.UseMvc调用之前的任何地方使用call。我确实找到了你的链接或类似的关于创建中间件的链接。我的问题是,我现在只想测试一下。通过所有帐户,如果我发布站点,HTTPS将在提供有效证书的情况下工作。是否有方法仅为测试目的添加HTTPS?这也会在主页上提供HTTP 404。如上所述,尝试这样做会在主页上提供HTTP 404。我确实选中了项目属性中的复选框,我从中获得HTTPS端口。我还如果可以避免的话,我不想再使用Kestrel了,因为它已经存在于项目中了。我确实在发布之前遵循了您提供的链接,但我没有得到Wildermuth暗示的结果。只要您在IISExpress中运行它,自签名证书就应该可以工作。您确实需要更改启动url以匹配发布时生成的ssl url勾选该框。应用过滤器后,非ssl url将给出一个404,因此,如果您仍将其用作启动url,则可能是问题所在