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

标签 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=rewrite localhost:62274

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

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

我已经寻找这个问题的答案两天了。如前所述,这是我制作的一个测试应用程序,用于学习 .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();
}

最佳答案

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

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

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

  2. 我使用了以下命令。

ngrok.exe http 8042 ( what ever port you choose)

确保您使用了上面的命令而不是您使用过的命令。在您的命令中,您使用了特殊的 -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

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

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

  • 之前在评论中我说过它与 MVC5 配合良好,但仅当您使用默认身份验证时才有效。如果您使用 Owin 管道并在 ngrok.exe 开关中使用 -host-header 开关,那么您将得到相同的错误。
  • <小时/>

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

    1. 真正的原因是它无法正确构建 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 时。

    关于asp.net - 如何使 Asp.NET Core MVC 应用程序在授权重定向上使用外部 url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369985/

    相关文章:

    c# - 在 dotnet 核心 "the configured user limit (128) on the number of inotify instances has been reached"中读取 json 文件时出错

    javascript - if 语句引发回调

    c# - 使用列索引将 DataTable 拆分为 2

    javascript - 验证 AjaxFileUpload 中存在的文件是否已上传或挂起

    javascript - 如何保护从站点窃取的经度/纬度值

    asp.net-mvc - asp.net mvc-将部分数据模型传递到部分 View

    c# - 如何从 net Core 中的异常中获取行号和文件名?

    c# - 多部分数据意外结束

    c# - 使用 Newtonsoft 序列化一个对象?

    html - 带有razor viewengine的MVC 3中的动态属性值