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

Posted

技术标签:

【中文标题】如何使 Asp.NET Core MVC 应用程序在授权重定向上使用外部 url?【英文标题】:How to make Asp.NET Core MVC app use external urls on Authorize redirection? 【发布时间】:2016-11-17 02:55:31 【问题描述】:

我正在寻找问题标题中所述问题的解决方案。 更准确地说 - 我正在运行测试应用程序 (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://.ngrok.io/Account/Login 它指向:http://localhost:62274/Account/Login

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

【问题讨论】:

我同意@Akkaryk 的观点,并且我还在 ASP.net 核心中验证了这个问题。 ngrok 适用于 ASP.net MVC 5。 不要在您的标题中添加 SOLVED,也不要在问题本身中回答您的问题。而是发布答案。 @CodeCaster 答案已发布在下面(仅在答案 cmets 中)。在没有明确说明问题已解决的情况下留下问题是没有意义的 - 在问题本身的底部不包括解决方案也没有意义(效率!^^ 没有新人有时间阅读所有答案和cmets) 不,这根本不是这个网站的运作方式。接受标记表明该问题已为您解决。请张贴自我回答,不要回答问题。 @CodeCaster Okaaay - 猜我真的是新来的。好吧,我就照你说的做^^' 【参考方案1】:

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

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

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

    我使用了以下命令。

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 已经处于调试模式,则停止并重新启动。它现在应该可以工作了。因为它对我有用。

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

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

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

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

    第二个原因当你在上面使用 ngrok 并且你观察 Request.Host 总是 localhost: 这会产生问题。 (这是罪魁祸首)

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

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

【讨论】:

不幸的是,按照您的指示@dotnetstep 会导致:link 并在将整个 Visual Studio 重新加载到此之后:link... 我可能又做错了什么:|这是我的整个 applicationhost.config:link - 我无法删除您未包含的部分,因为它们是在构建为站点时重新生成的:AppPostgreSQL (2)... OK - 这看起来是一个 100% 有效的解决方案,但它不起作用。如果我将 localhost 更改为 *,它将拒绝构建项目或使用 :localhost 添加新的 。还有其他想法吗?有人吗? 您是否尝试过发布本地 iis 而不是 iis express ?此外,您只需在应用程序主机配置文件中使用 * 更改 localhost。 当我在 applicationhost.config 文件中将 localhost 更改为 * 时,项目无法构建(上面发布了错误)。它稍后会在下面添加具有更高 id 的新 条目并重新生成“localhost”部分。关于本地 IIS - 我没有 - 我会尝试看看它是否有帮助 ;) 我已经确认发布到 IIS 后发生错误(即使在 Ubuntu 上 - 问题最初出现在 Windows 10 上)。我确定罪魁祸首是将 ngrok 与 -host-header=rewrite localhost: 一起使用,但我无法使用 * 替换 localhost 来运行应用程序。我将尝试在不运行的情况下构建和发布应用程序(按照建议使用 * 并且不使用 -host-header=rewrite)。

以上是关于如何使 Asp.NET Core MVC 应用程序在授权重定向上使用外部 url?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)

ASP.NET Core mvc 应用程序中的 FFMPEG 录制

如何先用asp.net身份框架数据库将asp.net mvc迁移到asp.net core

如何将项目引用添加到 ASP.NET Core 1.0 MVC 项目

我应该如何保护我的 Web 应用程序(ASP.Net Core 3.1 MVC)?