使用 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 用户的主要内容,如果未能解决你的问题,请参考以下文章

按下按钮时未从数组中填充 UILabel

模拟 API 调用时未填充 Redux 存储

Gmail API 游乐场:发送方法,转换后的 MIME 原始标头在发送时未填充电子邮件字段

使用内连接 SQL 语句时未定义的索引

REACT.JS - 如何使用 react-openidconnect 调用登录

使用 OpenIDConnect 时如何注销 ClaimsIdentity 用户