如何指定多个默认注销方案?



我正在使用WsFed将ADFS SSO实现到应用程序中。为了正确注销,我必须指定SignOut方法的CookieAuthenticationDefaults.AuthenticationSchemeWsFederationDefaults.AuthenticationScheme方案。如果我只使用 cookie 方案,则不会注销。如果我仅使用 WsFed 方案,则我已注销,但如果我单击浏览器后退按钮,则可以自动重新进行身份验证。

目前,我正在为 SignOut 方法指定它们。但是,我不想在多个地方(启动.cs和控制器操作(中使用这些方案。

我知道,如果我不提供方案,那么它默认为一个,就像我的Login操作一样。但是,是否可以将其默认为两个方案,或者只需要在操作中对其中一个方案进行硬编码?

注销操作:

[AllowAnonymous]
[HttpGet]
public IActionResult Logout()
{
return SignOut(
new AuthenticationProperties
{
RedirectUri = Url.Action("LoggedOutSuccessfully", "NameController"),
},
WsFederationDefaults.AuthenticationScheme,
CookieAuthenticationDefaults.AuthenticationScheme);
}

启动.cs默认方案设置:

services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
//need two schemes here (or somewhere) instead of one
sharedOptions.DefaultSignOutScheme = WsFederationDefaults.AuthenticationScheme;
})
.AddWsFederation(options =>
{
//... WsFed options
})
.AddCookie(options =>
{
//... cookie options
});

简短的回答是否定的,默认情况下,您无法真正组合多个方案。

其原因主要是由于方案可能是什么:cookie 方案实际上是您可以注销的最简单的方案之一,因为它只需要清除用户的 cookie,因此不需要自己的 HTTP 响应。相反,它可以与另一个响应结合使用,例如从远程身份验证提供程序注销的远程方案。

WS 联合身份验证是一种远程身份验证方案,这基本上意味着它依赖于远程身份验证提供程序来实际执行用户身份验证。在大多数情况下,使用远程身份验证提供程序登录意味着该提供程序还将自行创建用户会话,以便后续身份验证请求可以依赖现有的用户会话对用户进行身份验证,而无需询问他们的凭据。这也是跨多个应用程序进行单一登录的基础:使用中央身份验证提供程序登录一次,所有应用程序都可以透明地对用户进行身份验证,而无需要求他们重新进行身份验证。

不幸的是,对于注销过程,这意味着为了远程注销用户,必须将用户发送到该确切的身份验证提供程序才能在那里注销(仅仅是因为您无法自己清除身份验证提供程序的cookie(。这通常通过重定向到身份验证提供程序的注销页面来完成。由于重定向是单个 HTTP 响应,因此您可以将其与 Cookie 注销结合使用,但不能与其他远程身份验证注销结合使用。

根据协议和提供程序的功能,协议可能允许您指定用户在成功注销后重定向回的返回 URL。此机制可用于将注销与多个身份验证处理程序链接在一起,每个处理程序都需要自己的 HTTP 响应。但你必须自己处理。

最后,是否要远程注销用户也是您的选择。根据您的设置,您可能只想在本地注销用户(通过 cookie 方案(,但使用其远程身份验证处理程序保持登录状态。因此,通过在注销时选择方案,您也可以控制它。

最新更新