SignOut 不会重定向到站点主页
SignOut does not redirect to site home page
我正在尝试设置一个 ASP.net Core 3 MVC 应用程序,它使用 OIDC 连接到我公司的 SSO 门户 (OpenAM)。
我使用 Visual Studio 2019 项目生成器创建了一个没有身份验证的基本应用程序,然后我按照 http://docs.identityserver.io/en/latest/quickstarts/2_interactive_aspnetcore.html#creating-an-mvc-client 中的步骤添加了 OIDC 客户端功能。
登录效果很好,对启动的更改很少 class:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Setup Identity Server client
JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "https://mycompany.com/ssoservice/oauth2";
options.RequireHttpsMetadata = false;
options.ClientId = "openIdClient";
options.ClientSecret = "secret";
options.ResponseType = "code";
options.ProtocolValidator.RequireNonce = false;
options.SaveTokens = true;
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
IdentityModelEventSource.ShowPII = true;
}
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.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
// endpoints.MapDefaultControllerRoute();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
我还设置了注销控制器操作:
[Authorize]
public IActionResult Logout()
{
return SignOut("Cookies", "oidc");
}
该操作确实有效,即当激活 cookie 时,cookie 被删除并且用户从 SSO 门户注销,但是当浏览器重定向到 /signout-callback-oidc 端点时,它收到一个 HTTP 200 响应,没有任何内容。我本以为它会自动重定向到站点主页“/”,这是 OpenIdConnectOptions.SignedOutRedirectUri 属性.
的默认值
我错过了什么?
你return退出,
相反,注销用户和 return RedirectToAction("Home","Index")
好的,经过更多时间的摆弄,我发现这是最新社区 OpenAM 版本中缺少实施草案的结果(以及当前付费的 ForgeRock AM,但他们正在努力:https://bugster.forgerock.org/jira/browse/OPENAM-13831).基本上,/signout-callback-oidc
的 .net 核心处理程序依赖于 state
参数可用以便重定向,就像评论中提到的 Ruard van Elburg:
OpenAM 没有发回 state
参数,正如我的日志中所报告的那样。因此,我们需要自己执行重定向——最直接的方法似乎是使用 OnSignedOutCallbackRedirect
事件:
Startup.cs
services.AddAuthentication(...)
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
...
options.Events.OnSignedOutCallbackRedirect += context =>
{
context.Response.Redirect(context.Options.SignedOutRedirectUri);
context.HandleResponse();
return Task.CompletedTask;
};
...
});
感谢所有回复讨论的用户,你们的贡献让我找到了正确解决方案的线索。
我正在尝试设置一个 ASP.net Core 3 MVC 应用程序,它使用 OIDC 连接到我公司的 SSO 门户 (OpenAM)。
我使用 Visual Studio 2019 项目生成器创建了一个没有身份验证的基本应用程序,然后我按照 http://docs.identityserver.io/en/latest/quickstarts/2_interactive_aspnetcore.html#creating-an-mvc-client 中的步骤添加了 OIDC 客户端功能。 登录效果很好,对启动的更改很少 class:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Setup Identity Server client
JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "https://mycompany.com/ssoservice/oauth2";
options.RequireHttpsMetadata = false;
options.ClientId = "openIdClient";
options.ClientSecret = "secret";
options.ResponseType = "code";
options.ProtocolValidator.RequireNonce = false;
options.SaveTokens = true;
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
IdentityModelEventSource.ShowPII = true;
}
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.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
// endpoints.MapDefaultControllerRoute();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
我还设置了注销控制器操作:
[Authorize]
public IActionResult Logout()
{
return SignOut("Cookies", "oidc");
}
该操作确实有效,即当激活 cookie 时,cookie 被删除并且用户从 SSO 门户注销,但是当浏览器重定向到 /signout-callback-oidc 端点时,它收到一个 HTTP 200 响应,没有任何内容。我本以为它会自动重定向到站点主页“/”,这是 OpenIdConnectOptions.SignedOutRedirectUri 属性.
的默认值我错过了什么?
你return退出,
相反,注销用户和 return RedirectToAction("Home","Index")
好的,经过更多时间的摆弄,我发现这是最新社区 OpenAM 版本中缺少实施草案的结果(以及当前付费的 ForgeRock AM,但他们正在努力:https://bugster.forgerock.org/jira/browse/OPENAM-13831).基本上,/signout-callback-oidc
的 .net 核心处理程序依赖于 state
参数可用以便重定向,就像评论中提到的 Ruard van Elburg:
OpenAM 没有发回 state
参数,正如我的日志中所报告的那样。因此,我们需要自己执行重定向——最直接的方法似乎是使用 OnSignedOutCallbackRedirect
事件:
Startup.cs
services.AddAuthentication(...)
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
...
options.Events.OnSignedOutCallbackRedirect += context =>
{
context.Response.Redirect(context.Options.SignedOutRedirectUri);
context.HandleResponse();
return Task.CompletedTask;
};
...
});
感谢所有回复讨论的用户,你们的贡献让我找到了正确解决方案的线索。