You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取已登录用户的身份验证方式?含账号密码及OAuth场景

获取已登录用户的身份验证方式

针对你遇到的问题,分两种场景给出具体解决方案:

一、用户名/密码登录场景

你已发现这类用户存在amr类型的声明(值为pwd),直接读取该声明即可,代码示例:

var amrClaim = HttpContext.User.FindFirst("amr")?.Value;
string authMethod = amrClaim == "pwd" ? "通过用户名/密码" : string.Empty;

ClaimTypes.AuthenticationMethod返回null的原因是,这个常量对应微软特定的声明URI,而你的系统使用的是标准amr(Authentication Methods Reference)声明,二者不匹配。

二、OAuth第三方登录场景

这类用户没有直接的认证方式声明,但可以通过认证方案名称判断登录来源:

string authScheme = HttpContext.User.Identity.AuthenticationType;
string authMethod = authScheme switch
{
    "Facebook" => "通过Facebook",
    "Google" => "通过Google",
    // 其他OAuth提供商按实际配置的方案名补充
    _ => "未知认证方式"
};

这里的AuthenticationType对应你在Startup/Program.cs中配置OAuth时的方案名称,例如配置Facebook登录的常规代码:

builder.Services.AddAuthentication()
    .AddFacebook(options =>
    {
        options.AppId = "你的AppId";
        options.AppSecret = "你的AppSecret";
        // 若自定义了方案名,需和上面判断逻辑对应
        // options.AuthenticationScheme = "CustomFacebookScheme";
    });

如果需要更灵活的方式,也可以在用户登录成功后手动添加认证方式声明,比如在OAuth回调事件中处理:

.AddFacebook(options =>
{
    // 其他配置项
    options.Events = new OAuthEvents
    {
        OnCreatingTicket = context =>
        {
            context.Identity.AddClaim(new Claim("auth_method", "通过Facebook"));
            return Task.CompletedTask;
        }
    };
});

之后就可以像读取amr声明一样,直接获取auth_method的值。

三、整合两种场景的通用方法

将两种判断逻辑结合,封装成通用方法:

public string GetUserAuthMethod(HttpContext httpContext)
{
    // 优先检查用户名密码登录的amr声明
    var amrClaim = httpContext.User.FindFirst("amr")?.Value;
    if (amrClaim == "pwd")
    {
        return "通过用户名/密码";
    }

    // 再判断OAuth登录的认证方案
    var authScheme = httpContext.User.Identity.AuthenticationType;
    return authScheme switch
    {
        "Facebook" => "通过Facebook",
        "Google" => "通过Google",
        _ => "未知认证方式"
    };
}

内容的提问来源于stack exchange,提问作者Grimm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:12:08