我目前正在努力使用一个Asp.net core 2应用程序,该应用程序使用两个openid提供程序进行身份验证,并映射到两个不同的身份验证方案(名称不同)。
我面临的问题是尝试注销当前正在使用的特定方案。例如,如果我同时支持Google和Facebook身份验证,则需要了解当前正在使用哪种方案,并调用指示正确方案的SignOut
方法。这使我可以清除本地cookie,还可以将用户重定向到外部身份提供商并注销。
问题是我无法找到一种GetCurrentScheme()
函数,因此我可以用来在SignOut
方法中指定方案。我确定我缺少基本的东西...
答案 0 :(得分:1)
似乎没有任何直接方法可以找到当前方案。这是一种粗略的方法:
private readonly IAuthenticationSchemeProvider authenticationSchemeProvider;
...
foreach(var scheme in authenticationSchemeProvider.GetRequestHandlerSchemesAsync()){
var authResult = await context.AuthenticateAsync(scheme.Name);
if(authResult.Succeeded)
// this is the scheme that was used for authentication
}
答案 1 :(得分:0)
当我需要使用不同的身份验证类型-JWT和Cookies时,我也遇到类似的问题。您可以使用IAuthenticationSchemeProvider以及有关身份验证的其他信息来获取当前方案。
private readonly IAuthenticationSchemeProvider _authenticationSchemeProvider;
public AuthController(IAuthenticationSchemeProvider authenticationSchemeProvider)
{
_authenticationSchemeProvider = authenticationSchemeProvider;
}
-
public async Task<bool> Logout()
{
// Default AuthenticationScheme
AuthenticationScheme defaultScheme = await _authenticationSchemeProvider.GetDefaultAuthenticateSchemeAsync();
// The scheme that will be used by default
AuthenticationScheme defaultSignoutScheme= await _authenticationSchemeProvider.GetDefaultSignOutSchemeAsync();
// Returns all schemes currently registered
IEnumerable<AuthenticationScheme> listAuthenticationSchemeProvider = await _authenticationSchemeProvider.GetAllSchemesAsync();
await HttpContext.SignOutAsync(defaultScheme.Name);
return true;
}
答案 2 :(得分:0)
我有同样的问题,但我最终将身份验证方案放入我的 SignIn
方法的声明集合中:
claims.Add(new Claim(ClaimTypes.AuthenticationMethod, authenticationScheme));
因此,在 SignOut
方法中,我可以检索身份验证方案:
var authenticationScheme = HttpContext.User.FindFirstValue(ClaimTypes.AuthenticationMethod);