ASP.NET Core 5 MVC和OpenID Connect-在远程Windows服务器上托管时出错



我在远程Windows 2019服务器上运行ASP.NET Core 5 MVC web应用程序时遇到了问题。

我创建了一个示例测试应用程序;MS标识";身份验证方案,使用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.jsonAzureAd部分中),在本地,这很好——当我点击http://localhost:1234/URL时,Azure AD会提示我输入凭据,在我提供凭据后,我登录后,我的声明设置正确——一切似乎都很好(http://localhost:1234/signin-oidc已在Azure AD应用程序注册中设置为回调路径)。

现在,我通过从Visual Studio发布到一个文件夹,并手动将所有这些文件复制到远程Win2019服务器,将其部署到Windows 2019服务器的旧版本。我设置了一个IIS应用程序,指向那个目录——一切似乎都很好。

但是,当我尝试访问远程URLhttps://myserver.mycompany.org/myapp时,OpenID Connect回调路径https://myserver.mycompany.org/myapp/signin-oidc会出现错误http 403-禁用

是的,我已经将这个URL设置为";回调";我的Azure应用程序注册中的URL-但我仍然得到一个被禁止的http 403。有什么想法吗?我是否需要在远程IIS配置中执行额外的步骤,以允许MS Identity子系统对./signin-oidc路径执行OIDC回调?

(附言:当我试图为OpenId Connect和ASP.NET Core部署任何Microsoft示例应用程序时,也会出现同样的错误-在Github上可以找到:https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2.由于我不认为MS会发布实际不起作用的代码,我确信在远程服务器上的IIS中部署/设置我的应用程序时,我一定错过了一两步)

原来这是由于IIS中的配置继承造成的。

我有一个第一个ASP.NET核心应用程序在";根";IIS站点的——当然它有一个web.config,看起来像这样:

<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" 
modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".MyRootApp.dll" 
stdoutLogEnabled="false" stdoutLogFile=".logsstdout" hostingModel="inprocess" />
</system.webServer>

然后,在我的MyAppIIS应用程序中;低于";";默认站点";,我有第二个ASP.NET Core应用程序,当然它也有一个定义另一个handlerweb.config,这导致了混乱。

经过大量的搜索,我在interwebs上的某个地方发现了一篇帖子,它提供了解决方案-修改web.config以仅将设置应用于应用程序自己的目录-而不是将其继承给子代;通过使用<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=".logsstdout" hostingModel="inprocess" />
</system.webServer>
</location>

相关内容

  • 没有找到相关文章

最新更新