2017-04-25 4 views
0

これは私のExternalLoginConfirmationタスクです。これは、プロジェクトの作成時に追加されるデフォルトのコードです。私は、ユーザーの主張を取得するためにこれらの行を追加しました:mvcでユーザーのプロファイルイメージを取得するためのClaimTypes 6

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); 
    } 

infoExternalPrincipalが不足していると、次の機能は、いずれかの利用できないことに注意してください:

info.ExternalPrincipal.FindFirstValue("pictureUrl"); 
+0

これについての回答が見つかりましたか? – Diomedes

+0

@Diomedes googleはこのようなプロフィール画像の提供を停止しており、google plus apiを有効にして、提供されたAPIキーを使用してプロフィール画像をリクエストする必要があります。私が使用しているソリューションを1分で追加しています。答えを確認してください –

+0

@Diomedes私は自分のプロジェクトからコピーした答えを追加しました。私はイメージのリンクを取得し、データベースに追加します。あなたはそれを変更したいかもしれません。 –

答えて

1

これは私が今使っているsoultionです:

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:このコードをはExternalLoginConfirmationに追加する必要があります。AccountControllersコントローラ

関連する問題