2017-09-02 33 views
4

私はdotnet coreを使用しています。Facebook、Google、twitterなどのLinkedIn用のデフォルト認証ビルダーがないため、サイトでLinkedIn認証を設定します。addonuth in dotnet core 2.0

services.AddAuthentication().AddOAuth("LinkedIn", 
      c => 
      { 
       c.ClientId = Configuration["linkedin-app-id"]; 
       c.ClientSecret = Configuration["linkedin-app-secret"]; 
       c.Scope.Add("r_basicprofile"); 
       c.Scope.Add("r_emailaddress"); 
       c.CallbackPath = "/signin-linkedin"; 
       c.AuthorizationEndpoint = "https://www.linkedin.com/oauth/v2/authorization"; 
       c.TokenEndpoint = "https://www.linkedin.com/oauth/v2/accessToken"; 
       c.UserInformationEndpoint = "https://api.linkedin.com/v1/people/~:(id,formatted-name,email-address,picture-url)"; 
}) 

GetExternalLoginInfoAsync()がnullのため、アイデンティティASP.netコアソースを検索しているために問題が発生しました。これはプロバイダキーがnullであるためです。

はasp.netのコアコードから撮影:

var providerKey = auth.Principal.FindFirstValue(ClaimTypes.NameIdentifier); 
var provider = items["LoginProvider"] as string; 
if (providerKey == null || provider == null) 
{ 
    return null; 
} 

私はLinkedInの請求にClaimTypes.NameIdentifierを追加することができる場所の質問はありますか?

.AddOAuth("LinkedIn", 
      c => 
      { 
       c.ClientId = Configuration["linkedin-app-id"]; 
       c.ClientSecret = Configuration["linkedin-app-secret"]; 
       c.Scope.Add("r_basicprofile"); 
       c.Scope.Add("r_emailaddress"); 
       c.CallbackPath = "/signin-linkedin"; 
       c.AuthorizationEndpoint = "https://www.linkedin.com/oauth/v2/authorization"; 
       c.TokenEndpoint = "https://www.linkedin.com/oauth/v2/accessToken"; 
       c.UserInformationEndpoint = "https://api.linkedin.com/v1/people/~:(id,formatted-name,email-address,picture-url)"; 
       c.Events = new OAuthEvents 
       { 
        OnCreatingTicket = async context => 
        { 
         var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint); 
         request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken); 
         request.Headers.Add("x-li-format", "json"); 

         var response = await context.Backchannel.SendAsync(request, context.HttpContext.RequestAborted); 
         response.EnsureSuccessStatusCode(); 
         var user = JObject.Parse(await response.Content.ReadAsStringAsync()); 

         var userId = user.Value<string>("id"); 
         if (!string.IsNullOrEmpty(userId)) 
         { 
          context.Identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userId, ClaimValueTypes.String, context.Options.ClaimsIssuer)); 
         } 

         var formattedName = user.Value<string>("formattedName"); 
         if (!string.IsNullOrEmpty(formattedName)) 
         { 
          context.Identity.AddClaim(new Claim(ClaimTypes.Name, formattedName, ClaimValueTypes.String, context.Options.ClaimsIssuer)); 
         } 

         var email = user.Value<string>("emailAddress"); 
         if (!string.IsNullOrEmpty(email)) 
         { 
          context.Identity.AddClaim(new Claim(ClaimTypes.Email, email, ClaimValueTypes.String, 
           context.Options.ClaimsIssuer)); 
         } 
         var pictureUrl = user.Value<string>("pictureUrl"); 
         if (!string.IsNullOrEmpty(pictureUrl)) 
         { 
          context.Identity.AddClaim(new Claim("profile-picture", pictureUrl, ClaimValueTypes.String, 
           context.Options.ClaimsIssuer)); 
         } 
        } 
       }; 

      }) 
:この場合

答えて

12

は、手動でこのようOauthEventを使用して、各クレームを事前に実装するために持っています
関連する問題