使用 OpenIdConnect 时未填充 .Net Core Identity 用户
Posted
技术标签:
【中文标题】使用 OpenIdConnect 时未填充 .Net Core Identity 用户【英文标题】:.Net Core Identity User not populated when using OpenIdConnect 【发布时间】:2021-09-04 23:52:19 【问题描述】:我正在将 OpenIdConnect 实现到 .Net Core 应用程序中,该应用程序将外部登录名与存储在内部(默认身份)数据库中的用户相关联,并尝试登录。登录方法报告成功,但 User 对象未填充。 登录过程是脚手架,所以它都是样板文件,包括外部登录过程。
如果能帮助我理解我做错了什么,我将不胜感激。
services.AddAuthentication(options =>
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = "oidc";
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
)
.AddCookie()
.AddOpenIdConnect(options =>
options.Authority = oauthSettings.Location.AbsoluteUri;
options.RequireHttpsMetadata = false;
options.ClientId = oauthSettings.ClientID;
options.ClientSecret = oauthSettings.ClientSecret;
options.ResponseType = "id_token token";
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
);
//In Login.cshtml.cs
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
if (result.RequiresTwoFactor)
return RedirectToPage("./LoginWith2fa", new ReturnUrl = returnUrl, RememberMe = Input.RememberMe );
if (result.IsLockedOut)
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
else
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
// If we got this far, something failed, redisplay form
return Page();
编辑:我发现当我在 Startup 中删除 AddAuthentication 方法时,登录有效,但显然禁用了外部身份验证。关于添加 OpenIdConnect 的一些事情正在破坏登录过程。
【问题讨论】:
请用代码sn-ps替换截图。 @tmsbrndz 我已经用代码替换了一个,其他的是调试结果 你能在你的PasswordSignInAsync
周围显示代码吗?我几乎认为你需要ExternalLoginSignInAsync
或HttpContext.AuthenticateAsync();
。
我已经添加了,但它是样板,所以如果这是问题,我会感到惊讶。脚手架代码内置了外部登录功能。
除了获取已注册外部方案的列表之外,所有这些代码处理的都是密码登录。不幸的是,我快要睡着了,所以我真的帮不上什么忙。
【参考方案1】:
为了解决这个问题,我在启动时做了以下操作:
services.AddAuthentication(options =>
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = "oidc";
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
)
.AddCookie()
.AddOpenIdConnect(options =>
options.Authority = oauthSettings.Location.AbsoluteUri;
options.RequireHttpsMetadata = false;
options.ClientId = oauthSettings.ClientID;
options.ClientSecret = oauthSettings.ClientSecret;
options.ResponseType = "id_token token";
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
);
所以我将其保留为默认值并且它起作用了。我不是 100% 为什么。
【讨论】:
以上是关于使用 OpenIdConnect 时未填充 .Net Core Identity 用户的主要内容,如果未能解决你的问题,请参考以下文章
Gmail API 游乐场:发送方法,转换后的 MIME 原始标头在发送时未填充电子邮件字段