如何获取已登录用户的身份验证方式?含账号密码及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
相关产品推荐
相关产品推荐

