Итак, я установил совершенно новое приложение mvc dotnet core.Нет безопасности.Затем я добавил open id connect security при запуске так:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
var clientId = Configuration["clientID"];
var metadataAddress = Configuration["MetadataAddress"];
var Wtrealm = Configuration["Wtrealm"];
string signedOutCallbackPath = Configuration["SignedOutCallbackPath"];
string postLogoutUrl = Configuration["postLogoutUrl"];
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie("Cookies")
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.SaveTokens = true;
options.ClientId = clientId;
options.Authority = metadataAddress;
options.SignedOutCallbackPath = signedOutCallbackPath;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role",
};
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Это работает для входа в систему.Затем я добавил
public async Task<IActionResult> Logout(string callBack)
{
return SignOut("Cookies", OpenIdConnectDefaults.AuthenticationScheme);
}
public async Task<IActionResult> LogoutComplete()
{
return View();
}
Выход из системы, чтобы инициировать выход из системы и выход для обработки очистки после завершения выхода из системы. Выйти работает для моего приложения.Затем он перенаправляет на IdP для выхода.Он работает нормально, затем перенаправляет браузер на LogoutComplete .Вот тут и начинается странность: LogoutComplete возвращает 302 в домашний контроллер, но я не знаю почему.Он никогда не попадает в точку отладки в методе.Он не возвращает представление, для которого он предназначен.Этот метод работает нормально (возвращает свое собственное представление), когда промежуточное программное обеспечение openIdConnect не включено.Почему это происходит?Как это вообще возможно?Зачем промежуточному продукту угонять LogoutComplete?Это в спецификации?OpenIDProvider был установлен в ADFS 2016, а другой - в ID Server 4. В обоих случаях приложение работало одинаково.Так что я уверен, что это не проблема конфигурации провайдера / сервера IdP.