在ASP.NET Core 2中获取当前的身份验证方案

时间:2019-02-22 18:01:41

标签: authentication asp.net-core openid

我目前正在努力使用一个Asp.net core 2应用程序,该应用程序使用两个openid提供程序进行身份验证,并映射到两个不同的身份验证方案(名称不同)。

我面临的问题是尝试注销当前正在使用的特定方案。例如,如果我同时支持Google和Facebook身份验证,则需要了解当前正在使用哪种方案,并调用指示正确方案的SignOut方法。这使我可以清除本地cookie,还可以将用户重定向到外部身份提供商并注销。

问题是我无法找到一种GetCurrentScheme()函数,因此我可以用来在SignOut方法中指定方案。我确定我缺少基本的东西...

3 个答案:

答案 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;
}

Docs

答案 2 :(得分:0)

我有同样的问题,但我最终将身份验证方案放入我的 SignIn 方法的声明集合中:

claims.Add(new Claim(ClaimTypes.AuthenticationMethod, authenticationScheme));

因此,在 SignOut 方法中,我可以检索身份验证方案:

var authenticationScheme = HttpContext.User.FindFirstValue(ClaimTypes.AuthenticationMethod);