2017-11-13 17 views
0

私は.netコア2.0アプリを持っており、Google、twitter、facebookなどの外部ログインプロバイダを実装しています。ユーザーの表示名とプロフィール画像を取得する必要があり、.net core 2.0でこれを達成する方法のドキュメントが見つかりません。.netコア2.0外部ログイン - 追加のプロフィール情報

私はこの記事のような認証を追加します。ここではhttps://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/

は私のTwitterのログインおよびコールバック関数です...

[HttpGet] 
    [Route("/api/security/login/type/socialmedia/twitter")] 
    public IActionResult GetTwitterLogin(string redirect_uri) 
    { 
     ClientCallback = redirect_uri; 
     string redirectUrl = "/api/security/login/type/socialmedia/twittercallback"; 
     var properties = SignInManager.ConfigureExternalAuthenticationProperties("Twitter", redirectUrl); 
     return Challenge(properties, "Twitter"); 
    } 

    [HttpGet] 
    [Route("/api/security/login/type/socialmedia/twittercallback")] 
    public async Task<HttpResponseMessage> GetTwitterCallBackAsync() 
    { 
     var info = await SignInManager.GetExternalLoginInfoAsync(); 

     var result = await SignInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true); 
     if (result.Succeeded) 
     { 

     } 
     else 
     { 

     } 


     Response.StatusCode = (int)HttpStatusCode.OK; 
     return null; 
    } 

あなたはinfo.Principal.Claimsからいくつかのアイテムを取得することができますように見え、ユーザーの表示名やプロフィール画像には何も表示されません。

さまざまなログインプロバイダの表示名またはプロフィール画像を取得するにはどうすればよいですか?

答えて

1

最後にこれを理解しました。認証を設定するときにクレームを追加する必要があります。これらの主張は、結果として生じるjson応答を見て、そこから項目を引き出します。関連する行はClaimActions項目です。首尾よくあなたがクレームを照会し、

var profileImageClaim = info.Principal.Claims.Where(x => x.Type == "profile-image-url").FirstOrDefault(); 

Facebookの画像は、GoogleとTwitterの異なる値を見つけることができる取り込ま場合

var info = await SignInManager.GetExternalLoginInfoAsync(); 

を使用して、コールバックでのログイン情報を取得した後

services.AddAuthentication() 
       .AddTwitter(twitterOptions => 
       { 
        twitterOptions.ConsumerKey = cfg.SystemConfig["TwitterConsumerKey"]; 
        twitterOptions.ConsumerSecret = cfg.SystemConfig["TwitterConsumerSecret"]; 
        twitterOptions.SaveTokens = true; 
        twitterOptions.RetrieveUserDetails = true; 
        twitterOptions.ClaimActions.MapJsonKey("display-name", "name"); 
        twitterOptions.ClaimActions.MapJsonKey("profile-image-url", "profile_image_url_https"); 
       }) 
       .AddFacebook(facebookOptions => 
       { 
        facebookOptions.AppId = cfg.SystemConfig["FacebookClientId"]; 
        facebookOptions.AppSecret = cfg.SystemConfig["FacebookClientSecret"]; 
        facebookOptions.SaveTokens = true; 
        facebookOptions.ClaimActions.MapJsonKey("display-name", "name"); 

       }) 
       .AddGoogle(googleOptions => 
       { 
        googleOptions.ClientId = cfg.SystemConfig["GoogleClientId"]; 
        googleOptions.ClientSecret = cfg.SystemConfig["GoogleClientSecret"]; 
        googleOptions.SaveTokens = true; 
        googleOptions.ClaimActions.MapJsonSubKey("profile-image-url", "image", "url"); 
        googleOptions.ClaimActions.MapJsonKey("display-name", "displayName"); 
       }); 

を使用して見つけることができます...

var claim = info.Principal.Claims.Where(x => x.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").FirstOrDefault(); 
var url = "http://graph.facebook.com/" + claim.Value + "/picture"; 
0

ASP.NET Core 2.0では、FacebookOptionsは、ClaimInctionsの拡張メソッドを使用して、UserInformationEndpointによって返されたプロファイルデータをマップします。上記マッピングで

ClaimActions.MapJsonKey(ClaimTypes.DateOfBirth, "birthday"); 

、「誕生日」がクレームClaimTypes.DateOfBirthで表される値にマッピングのFacebookグラフAPI応答の最上位レベルのプロパティです。

claimがNewtonSoftで、あなたが同じことをするだろうプロフィールの写真をつかむために、しかし、グラフAPIレスポンスは、ネストされたJSONオブジェクトであるに絵以来、あなたはここでMapCustomJson()

services.AddAuthentication() 
    .AddFacebook(options => 
    { 
     // ...other options omitted 
     options.Fields.Add("picture"); 

     options.ClaimActions.MapCustomJson("urn:facebook:picture", 
         claim => (string)claim.SelectToken("picture.data.url")); 
    }) 

を使用する必要がありますJObjectJPath構文を使用してネストされたプロパティ値を選択し、文字列にキャストします。

プロフィール画像のURLがClaimsのリストに表示されます。

関連する問題