如何指定多个默认注销方案?
How to specify multiple default sign out schemes?
我正在使用 WsFed 将 ADFS SSO 实施到应用程序中。为了正确注销,我必须为 SignOut
方法指定 CookieAuthenticationDefaults.AuthenticationScheme
和 WsFederationDefaults.AuthenticationScheme
方案。如果我只使用 cookie 方案,我不会退出。如果我只使用 WsFed 方案,我会注销,但如果我单击浏览器后退按钮,我可以自动重新进行身份验证。
目前,我正在为 SignOut 方法指定它们。但是,我不想在多个地方使用这些方案(Startup.cs 和控制器操作)。
我知道,如果我不提供方案,那么它会默认为一个方案,就像在我的 Login
操作中一样。但是是否可以让它默认为两种方案,或者只需要在操作中硬编码其中一种方案?
注销操作:
[AllowAnonymous]
[HttpGet]
public IActionResult Logout()
{
return SignOut(
new AuthenticationProperties
{
RedirectUri = Url.Action("LoggedOutSuccessfully", "NameController"),
},
WsFederationDefaults.AuthenticationScheme,
CookieAuthenticationDefaults.AuthenticationScheme);
}
Startup.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-Federation 是一种远程身份验证方案,基本上意味着它依赖于远程身份验证提供程序来实际执行用户身份验证。在大多数情况下,使用远程身份验证提供程序登录意味着该提供程序还将自己创建一个用户会话,以便后续的身份验证请求可以依赖已经存在的用户会话来对用户进行身份验证,而无需询问他们的凭据。这也是跨多个应用程序单点登录的基础:您使用中央身份验证提供程序登录一次,所有应用程序都可以透明地对用户进行身份验证,而无需要求他们重新进行身份验证。
对于注销过程,不幸的是,为了让用户远程注销,必须将用户发送到那个确切的身份验证提供商以在那里注销(仅仅是因为您无法自己清除身份验证提供程序的 cookie)。这通常是通过重定向到身份验证提供程序的注销页面来完成的。由于重定向是单个 HTTP 响应,您可以将其与 cookie 退出结合使用,但不能与另一个远程身份验证退出结合使用。
根据协议和提供商的能力,协议可能允许您指定 return URL 用户在成功注销后被重定向回。此机制可用于 链接 多个身份验证处理程序的注销,每个身份验证处理程序都需要自己的 HTTP 响应。但你必须自己处理。
最后,是否要远程注销用户也是您的选择。根据您的设置,您可能只想在本地注销用户(通过 cookie 方案),但让他们使用远程身份验证处理程序登录。因此,通过选择退出时的方案,您也可以控制它。
我正在使用 WsFed 将 ADFS SSO 实施到应用程序中。为了正确注销,我必须为 SignOut
方法指定 CookieAuthenticationDefaults.AuthenticationScheme
和 WsFederationDefaults.AuthenticationScheme
方案。如果我只使用 cookie 方案,我不会退出。如果我只使用 WsFed 方案,我会注销,但如果我单击浏览器后退按钮,我可以自动重新进行身份验证。
目前,我正在为 SignOut 方法指定它们。但是,我不想在多个地方使用这些方案(Startup.cs 和控制器操作)。
我知道,如果我不提供方案,那么它会默认为一个方案,就像在我的 Login
操作中一样。但是是否可以让它默认为两种方案,或者只需要在操作中硬编码其中一种方案?
注销操作:
[AllowAnonymous]
[HttpGet]
public IActionResult Logout()
{
return SignOut(
new AuthenticationProperties
{
RedirectUri = Url.Action("LoggedOutSuccessfully", "NameController"),
},
WsFederationDefaults.AuthenticationScheme,
CookieAuthenticationDefaults.AuthenticationScheme);
}
Startup.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-Federation 是一种远程身份验证方案,基本上意味着它依赖于远程身份验证提供程序来实际执行用户身份验证。在大多数情况下,使用远程身份验证提供程序登录意味着该提供程序还将自己创建一个用户会话,以便后续的身份验证请求可以依赖已经存在的用户会话来对用户进行身份验证,而无需询问他们的凭据。这也是跨多个应用程序单点登录的基础:您使用中央身份验证提供程序登录一次,所有应用程序都可以透明地对用户进行身份验证,而无需要求他们重新进行身份验证。
对于注销过程,不幸的是,为了让用户远程注销,必须将用户发送到那个确切的身份验证提供商以在那里注销(仅仅是因为您无法自己清除身份验证提供程序的 cookie)。这通常是通过重定向到身份验证提供程序的注销页面来完成的。由于重定向是单个 HTTP 响应,您可以将其与 cookie 退出结合使用,但不能与另一个远程身份验证退出结合使用。
根据协议和提供商的能力,协议可能允许您指定 return URL 用户在成功注销后被重定向回。此机制可用于 链接 多个身份验证处理程序的注销,每个身份验证处理程序都需要自己的 HTTP 响应。但你必须自己处理。
最后,是否要远程注销用户也是您的选择。根据您的设置,您可能只想在本地注销用户(通过 cookie 方案),但让他们使用远程身份验证处理程序登录。因此,通过选择退出时的方案,您也可以控制它。