如何使Asp.NET Core MVC应用程序在授权重定向上使用外部URL?

时间:2016-07-14 09:06:26

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

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

  

ngrok.exe http -host-header =重写localhost:62274

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

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

我现在为这个问题搜索了2天的答案。如前所述,它是一个测试应用程序,我正在学习.net核心编程。限制是我不想写自己的授权 - 它很容易出现我的经验,它需要不断的安全更新,重新发明轮子没有意义,对吧?

问题发生在:

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

而不是重定向到:http://&lt; 8_random_characters&gt; .ngrok.io /帐户/登录指向:http://localhost:62274/Account/Login

更多细节(这是我在这里写的第一个问题,所以我希望它有点合适):<​​br/> - 它是使用MVS2015默认的“个人用户身份验证”的ASP.NET核心Web应用程序,
- 相关项目.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();
}

1 个答案:

答案 0 :(得分:2)

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

解决方案1:使其适用于IIS 现在我使用IIS。 (不是IIS Express)。

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

  2. 我使用了以下命令。

  3.   

    ngrok.exe http 8042(您选择的端口)

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

      

    ngrok.exe http -host-header =重写localhost:62274

    解决方案2:使其适用于IIS Express。

    你仍然必须使用我用过的命令代替你的命令。

      

    ngrok.exe http yourportnumber

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

    现在去.vs - &gt;配置 - &gt; 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开关,那么您将收到相同的错误。
    2. 其实我想把它放在评论中,但它有点长,所以我被放在这里。这就是为什么会这样发生的原因。

      1. 真正的原因是它无法正确构建url。 https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication/AuthenticationHandler.cs
      2. 在上面的cs文件中,BuildRedirectUri是为它构建登录uri。

        1. 当您使用ngrok时,在上面的第二个原因,您发现Request.Host始终是localhost:&lt;&gt;这会造成问题。 (这是罪魁祸首)

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

        3. 根据我的观点和MVC5的旧版本,它应该保留ngrok提供的主机名而不是localhost。我认为真正的问题是请求从IIS迁移到Kestrel。