如何使 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 添加新的以上是关于如何使 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