我在远程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.json
的AzureAd
部分中),在本地,这很好——当我点击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>
然后,在我的MyApp
IIS应用程序中;低于";";默认站点";,我有第二个ASP.NET Core应用程序,当然它也有一个定义另一个handler
的web.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>