ASP.NET Core 5 MVC 和 OpenID Connect - 在远程 Windows 服务器上托管时出错
ASP.NET Core 5 MVC and OpenID Connect - error when hosting on remote Windows server
我 运行 无法将我的 ASP.NET Core 5 MVC 网络应用程序转移到远程 Windows 2019 服务器上的 运行。
我创建了一个示例测试应用程序,使用“MS Identity”身份验证方案,它使用 OpenID Connect 根据我们公司的 Azure AD 对用户进行身份验证。
这是我的 Startup.cs
澄清:
public void ConfigureServices(IServiceCollection services)
{
List<string> initialScopes = new List<string>();
string scope = Configuration.GetValue<string>("MyAPI:Scopes");
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
.AddInMemoryTokenCaches();
services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
});
services.AddRazorPages()
.AddMvcOptions(options => { })
.AddMicrosoftIdentityUI();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
});
}
我在我们公司的 Azure 租户中注册了一个应用程序(所有相关信息都在 appsettings.json
的 AzureAd
部分),在本地,这工作得很好 - 当我点击 http://localhost:1234/
URL,Azure AD 提示我输入我的凭据,在我提供这些凭据后,我登录并正确设置了我的声明 - 一切似乎都很好(并且 http://localhost:1234/signin-oidc
已在 Azure AD 应用程序注册中设置为回调路径)。
现在我将它部署到 Windows 2019 服务器 - 老派,从 Visual Studio 发布到一个文件夹,然后手动将所有这些文件复制到远程 Win2019 服务器。我设置了一个 IIS 应用程序,指向该目录 - 一切似乎都很好。
但是当我尝试点击我的遥控器 URL https://myserver.mycompany.org/myapp
时,我收到一个错误 http 403 - forbidden OpenID Connect 回调路径 - https://myserver.mycompany.org/myapp/signin-oidc
.
是的 - 我 已经 在我的 Azure 应用程序注册中将此 URL 设置为“回调” URL - 但我仍然得到一个 http 403 禁止。任何想法为什么?我是否需要在远程 IIS 配置中执行额外的步骤以允许 MS Identity 子系统对 ./signin-oidc
路径执行 OIDC 回调?
(PS:当我尝试为 OpenId Connect 和 ASP.NET Core 部署任何 Microsoft 示例应用程序时发生相同的错误 - 在 Github 上找到:https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2。因为我不认为 MS 会发布实际上不起作用的代码,所以我确定在远程服务器上的 IIS 中部署/设置我的应用程序时我一定错过了一两步)
原来这是由于我的 IIS 中的配置继承所致。
我在 IIS 站点的“根目录”中有第一个 ASP.NET 核心应用程序 - 当然有一个 web.config
看起来像这样:
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*"
modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\MyRootApp.dll"
stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
然后,在我的 MyApp
IIS 应用程序中,位于“默认站点”根“下方”,我有第二个 ASP.NET 核心应用程序,当然它也有一个 web.config
定义了另一个 handler
- 这引起了混乱。
经过 大量 的搜索后,我在互联网上的某处找到了一个 post 提供了解决方案 - 修改 web.config
以仅将设置应用于应用程序自己的目录 - 而不是继承到 children;通过使用 <location>
XML 元素,如下所示:
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*"
modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\MyRootApp.dll"
stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
我 运行 无法将我的 ASP.NET Core 5 MVC 网络应用程序转移到远程 Windows 2019 服务器上的 运行。
我创建了一个示例测试应用程序,使用“MS Identity”身份验证方案,它使用 OpenID Connect 根据我们公司的 Azure AD 对用户进行身份验证。
这是我的 Startup.cs
澄清:
public void ConfigureServices(IServiceCollection services)
{
List<string> initialScopes = new List<string>();
string scope = Configuration.GetValue<string>("MyAPI:Scopes");
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
.AddInMemoryTokenCaches();
services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
});
services.AddRazorPages()
.AddMvcOptions(options => { })
.AddMicrosoftIdentityUI();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
});
}
我在我们公司的 Azure 租户中注册了一个应用程序(所有相关信息都在 appsettings.json
的 AzureAd
部分),在本地,这工作得很好 - 当我点击 http://localhost:1234/
URL,Azure AD 提示我输入我的凭据,在我提供这些凭据后,我登录并正确设置了我的声明 - 一切似乎都很好(并且 http://localhost:1234/signin-oidc
已在 Azure AD 应用程序注册中设置为回调路径)。
现在我将它部署到 Windows 2019 服务器 - 老派,从 Visual Studio 发布到一个文件夹,然后手动将所有这些文件复制到远程 Win2019 服务器。我设置了一个 IIS 应用程序,指向该目录 - 一切似乎都很好。
但是当我尝试点击我的遥控器 URL https://myserver.mycompany.org/myapp
时,我收到一个错误 http 403 - forbidden OpenID Connect 回调路径 - https://myserver.mycompany.org/myapp/signin-oidc
.
是的 - 我 已经 在我的 Azure 应用程序注册中将此 URL 设置为“回调” URL - 但我仍然得到一个 http 403 禁止。任何想法为什么?我是否需要在远程 IIS 配置中执行额外的步骤以允许 MS Identity 子系统对 ./signin-oidc
路径执行 OIDC 回调?
(PS:当我尝试为 OpenId Connect 和 ASP.NET Core 部署任何 Microsoft 示例应用程序时发生相同的错误 - 在 Github 上找到:https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2。因为我不认为 MS 会发布实际上不起作用的代码,所以我确定在远程服务器上的 IIS 中部署/设置我的应用程序时我一定错过了一两步)
原来这是由于我的 IIS 中的配置继承所致。
我在 IIS 站点的“根目录”中有第一个 ASP.NET 核心应用程序 - 当然有一个 web.config
看起来像这样:
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*"
modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\MyRootApp.dll"
stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
然后,在我的 MyApp
IIS 应用程序中,位于“默认站点”根“下方”,我有第二个 ASP.NET 核心应用程序,当然它也有一个 web.config
定义了另一个 handler
- 这引起了混乱。
经过 大量 的搜索后,我在互联网上的某处找到了一个 post 提供了解决方案 - 修改 web.config
以仅将设置应用于应用程序自己的目录 - 而不是继承到 children;通过使用 <location>
XML 元素,如下所示:
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*"
modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\MyRootApp.dll"
stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>