簡體   English   中英

ClaimTypes,用於在MVC 6中獲取用戶的個人資料圖像

[英]ClaimTypes for getting the user's profile image in mvc 6

這是我的ExternalLoginConfirmation任務,這是創建項目時添加的默認代碼。 我添加了以下幾行以獲得用戶要求:

user.Firstname = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.GivenName)?.ToString();
user.Lastname = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Surname)?.ToString();
user.Gender = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Gender)?.ToString();

但是,我無法獲取用戶個人資料圖片,因為它在ClaimTypes中不存在。

    public async Task<IActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl = null)
    {
        if (ModelState.IsValid)
        {
            // Get the information about the user from the external login provider
            var info = await _signInManager.GetExternalLoginInfoAsync();
            if (info == null)
            {
                return View("ExternalLoginFailure");
            }
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await _userManager.CreateAsync(user);
            if (result.Succeeded)
            {
                result = await _userManager.AddLoginAsync(user, info);
                if (result.Succeeded)
                {
                    user.Firstname = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.GivenName)?.ToString();
                    user.Lastname = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Surname)?.ToString();
                    user.Gender = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Gender)?.ToString();

                    await _signInManager.SignInAsync(user, isPersistent: false);
                    _logger.LogInformation(6, "User created an account using {Name} provider.", info.LoginProvider);
                    return RedirectToLocal(returnUrl);
                }
            }
            AddErrors(result);
        }

        ViewData["ReturnUrl"] = returnUrl;
        return View(model);
    }

請注意, info缺少ExternalPrincipal ,並且以下功能也不可用:

info.ExternalPrincipal.FindFirstValue("pictureUrl"); 

這是我現在使用的靈魂:

 var result = await _userManager.CreateAsync(user);
       if (result.Succeeded)
       {
            result = await _userManager.AddLoginAsync(user, info);
            if (result.Succeeded)
            {
                 if (info.LoginProvider.ToLower().IndexOf("google") != -1)
                    { await _userManager.AddClaimAsync(user, new Claim("GooglePlusId", info.ProviderKey));
                        try {
                                HttpClient client = new HttpClient();
                                HttpResponseMessage x = await client.GetAsync($"https://www.googleapis.com/plus/v1/people/{info.ProviderKey}?fields=image&key=YOUR_GOOGLE_PLUS_API_KEY");
                               dynamic img = Newtonsoft.Json.JsonConvert.DeserializeObject(await x.Content.ReadAsStringAsync());
                                user.PhotoLink = img.image.url;
                                db.SaveChanges();
                            }
                            catch { }

                    }

                        if (info.LoginProvider.ToLower().IndexOf("facebook") != -1)
                        {
                            user.PhotoLink = $"http://graph.facebook.com/{info.ProviderKey}/picture?type=square&width=50";
                        }   
                        await _signInManager.SignInAsync(user, isPersistent: false);
                        _logger.LogInformation(6, "User created an account using {Name} provider.", info.LoginProvider);
                        return RedirectToLocal(returnUrl);
                    }
                }

PS:此代碼應添加到AccountControllers控制器中的ExternalLoginConfirmation操作中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM