4

我正在寻找问题标题中所述问题的解决方案。更准确地说 - 我正在运行测试应用程序 (asp.net core/mvc) 并使用https://ngrok.com将其通过隧道在全球范围内访问。我为此使用的命令是:

ngrok.exe http -host-header=rewrite localhost:62274

“ngrok.exe http”用于初始化 ngrok,“-host-header=rewrite localhost:62274”更改标头以允许执行应用程序(因为 IIS 检查标头并阻止任何其他标头)。

我遇到的问题是授权失败后(客人试图访问受限页面)[Authorize] 指向内部链接(例如“ http://localhost:62274/Account/Login ”)。这不是故意的。
应用程序视图提供的所有链接都正常工作(它们使用 ngrok 提供的地址前缀)。我必须修复登录/注册的 returnUrl 参数,但它们现在可以正常工作。

我现在搜索了 2 天来寻找该问题的答案。如前所述,它是我正在制作的用于学习.net core 编程的测试应用程序。限制是我不想编写自己的授权- 这很容易导致我缺乏经验,它需要不断的安全更新,并且重新发明轮子没有意义,对吧?

问题发生在:

[Authorize("Admin")]
public async Task<IActionResult> DeleteDItem(int? id)

而不是重定向到: http://<8_random_characters>.ngrok.io/Account/Login 它指向:http://localhost:62274/Account/Login

更多细节(这是我在这里写的第一个问题,所以我希望它有点正确):
-它是一个使用 MVS2015 的默认“个人用户身份验证”的 ASP.NET Core Web 应用程序,
-相关 project.json 信息:

"dependencies": {  
  "BundlerMinifier.Core": "2.1.258",  
  "Microsoft.ApplicationInsights.AspNetCore": "1.0.0",  
  "Microsoft.AspNet.Authentication.Google": "1.0.0-rc1-final",  
  "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0",  
  "Microsoft.AspNetCore.Authentication.Facebook": "1.0.0",  
  "Microsoft.AspNetCore.Authentication.Google": "1.0.0",  
  "Microsoft.AspNetCore.Authorization": "1.0.0",  
  "Microsoft.AspNetCore.Diagnostics": "1.0.0",  
  "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0",  
  "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",  
  ...
  "Npgsql.EntityFrameworkCore.PostgreSQL": "1.0.0"

- Startup.cs 的相关部分:

public void ConfigureServices(IServiceCollection services)
{
  services.AddAuthorization(options =>
  {
    options.AddPolicy("Admin", policy => 
                               policy.RequireAuthenticatedUser());                
  });
  services.AddIdentity<ApplicationUser, IdentityRole>()
          .AddEntityFrameworkStores<ApplicationDbContext>()
          .AddDefaultTokenProviders();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
                      ILoggerFactory loggerFactory)
{
  app.UseIdentity();
}
4

1 回答 1

2

更新 1.(对于原始问题,请阅读下文)。

解决方案 1:让它与 IIS 一起工作 现在我让它与 IIS 一起工作。(不适用于 IIS Express)。

  1. 我在本地 iis 的特定端口上发布站点。

  2. 我使用了以下命令。

ngrok.exe http 8042(你选择什么端口)

确保您使用了您未使用的上述命令。在您的命令中,您使用了特殊的 -host-header=rewrite 选项。现在,当请求从 iis 移动到 Kerstel 服务器时,此选项将重写主机值。该主机值用于构建登录 url 并产生问题。

ngrok.exe http -host-header=rewrite localhost:62274

解决方案 2:使其与 IIS Express 一起工作。

您仍然必须使用我使用过的命令而不是您的命令。

ngrok.exe http yourportnumber

现在要使其与 IIS Express 一起使用,您必须转到解决方案根文件夹。你会在那里找到 .vs 文件夹。(它是隐藏的)。所以你也必须启用查看隐藏文件夹。

现在转到 .vs -> Config -> applicationhost.config

打开这个文件并搜索站点部分,它看起来像这样。(我已经删除了许多代码,因为您必须更新绑定信息)

<sites>          
            <site name="WebApplication2" id="4">                
                <bindings>
                    <binding protocol="http" bindingInformation="*:12619:localhost" />
                </bindings>
            </site>           
        </sites>

将其替换为(请参阅我将 localhost 替换为 *)

<sites>          
            <site name="WebApplication2" id="4">                
                <bindings>
                    <binding protocol="http" bindingInformation="*:12619:*" />
                </bindings>
            </site>           
        </sites>

注意: 1. 如果 VS 已经处于调试模式,请停止并重新启动。它现在应该可以工作了。因为它对我有用。

  1. 之前在评论中我说它适用于 MVC5,但只有在您使用默认身份验证时才适用。如果您使用 Owin 管道并在 ngrok.exe 开关中使用 -host-header 开关,那么您将得到相同的错误。

实际上我想把它放在评论中,但它有点长,所以我放在这里。这就是为什么会发生这种情况的原因。

  1. 真正的原因是它无法正确构建 url。 https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication/AuthenticationHandler.cs

在上面的 cs 文件中,BuildRedirectUri 是它的构建登录 uri。

  1. 上面使用 ngrok 并观察 Request.Host 的第二个原因始终是 localhost:<> 这会产生问题。(这是罪魁祸首)

  2. 我使用主机文件测试了其他方式,它工作正常。Request.Host 显示正确的主机名。

根据我的意见和旧版本的 MVC5,它应该保留提供的 ngrok 的主机名而不是 localhost。我认为真正的问题是当请求从 IIS 移动到 Kestrel 时。

于 2016-07-15T17:28:55.910 回答