我正在寻找问题标题中所述问题的解决方案。 更确切地说 - 我正在运行测试应用程序(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();
}
答案 0 :(得分:2)
更新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 - &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已经处于调试模式,则停止并重新启动。它现在应该工作。因为它适合我。
其实我想把它放在评论中,但它有点长,所以我被放在这里。这就是为什么会这样发生的原因。
在上面的cs文件中,BuildRedirectUri是为它构建登录uri。
当您使用ngrok时,在上面的第二个原因,您发现Request.Host始终是localhost:&lt;&gt;这会造成问题。 (这是罪魁祸首)
我使用主机文件测试了其他方式,它运行正常。 Request.Host显示正确的主机名。
根据我的观点和MVC5的旧版本,它应该保留ngrok提供的主机名而不是localhost。我认为真正的问题是请求从IIS迁移到Kestrel。