我正在寻找问题标题中所述问题的解决方案。更准确地说-我正在运行测试应用程序(asp.net core / mvc),并通过https://ngrok.com将其通过隧道传输到世界各地。我为此使用的命令是:
ngrok.exe http -host-header =重写localhost:62274
“ ngrok.exe http”用于初始化ngrok,“-host-header = rewrite localhost:62274”更改标头以允许执行应用程序(因为IIS检查标头并阻止了其他任何标头)。
我遇到的问题是授权失败(来宾试图访问受限页面)之后,[Authorize]指向内部链接(例如“ http:// localhost:62274 / Account / Login ”)。这不是故意的。
应用程序的视图提供的所有链接均正常运行(它们使用ngrok提供的地址前缀)。我必须修复Login / Register的returnUrl参数,但是它们现在可以正常工作。
我搜索该问题的答案已有2天了。如前所述,它是一个测试应用程序,我正在学习.net核心中的编程。限制是我不想编写自己的授权-这很容易导致我的经验不足,需要不断进行安全性更新,并且没有必要重新发明轮子,对吗?
问题发生在:
[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)。
我在本地iis的特定端口上发布站点。
我使用以下命令。
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-> 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已经处于调试模式,则将其停止并重新启动。现在应该可以工作了。因为它对我有用。
实际上,我想对此发表评论,但是它有点长,所以我被放在这里。这就是发生这种情况的原因。
在上面的cs文件BuildRedirectUri中为其构建登录uri。
在上面的第二个原因,当您使用ngrok并遵守Request.Host始终是localhost:<>时,会产生此问题。(这是罪魁祸首)
我使用主机文件测试了其他方式,并且工作正常。Request.Host显示正确的主机名。
根据我的意见和较旧版本的MVC5,它应保留提供的ngrok主机名而不是localhost。我认为真正的问题是当请求从IIS移至Kestrel时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句