我们正在使用 ASP.NET MVC 核心来编写 Web 应用程序。此应用程序需要多种形式的身份验证。目前它们是用户名/密码和 Microsoft Entra。但未来可能会添加更多内容。
当用户退出应用程序时,我们想知道用于登录的身份验证方法。例如,如果使用 Entra,我们希望将用户发送到“https://login.microsoftonline.com/” common/oauth2/v2.0/logout”,以便他们正确地从 Id Provider 中注销。
我认为一个好主意是在登录时在 cookie 中存储额外的声明。我尝试为此添加以下代码:
services.AddAuthentication()
.AddMicrosoftIdentityWebApp(options =>
{
options.Instance = "https://login.microsoftonline.com";
options.TenantId = "common";
options.ClientId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
options.ClientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
options.Scope.Add("email");
options.Events.OnTokenValidated = async context =>
{
var claim = new Claim(ClaimTypes.AuthenticationMethod, "Microsoft");
var claimsIdentity = context.Principal.Identity as ClaimsIdentity;
claimsIdentity.AddClaim(claim);
await Task.CompletedTask;
};
}, openIdConnectScheme: "Microsoft", cookieScheme: null);
使用此代码在回调方法中完成登录,当用户从提供商返回时调用该方法(在本例中为 Entra):
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
return RedirectToAction(nameof(Login));
}
// Sign in the user with this external login provider if the user already has a login.
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
if (result.Succeeded)
{
在注销期间,我尝试使用以下代码获取身份验证方法声明:
var scheme = User.FindFirstValue(ClaimTypes.AuthenticationMethod);
// Make some decisions based on scheme....
不幸的是,该方案无效。
我在这里做错了什么吗?也许我以错误的方式处理这整件事。
如有任何指点,将不胜感激。
有很多事情需要检查: