2017-10-03 14 views
0

.net core 1を使用... oauth2を使用してサインアップ/ログインすると、ローカルユーザーがいる場合でも、ID IDはoauthによって提供されます。 oauthユーザーとローカルIDユーザーとを結合する方法はありますか?Oauth IDユーザーが.net IDユーザーではありません

この例では、https://rameshksh.wordpress.com/2016/12/08/linkedin-authentication-in-asp-net-core/に「Identity」を使用してログインすることも、Oauthを使用してログインすることもできます。接続されていません。私は明白な何かを逃していますか、これはちょうどそれがどのように機能するのでしょ

+0

ローカルアカウントと他のプロバイダアカウント.....通常、ユーザーが初めてログインしたときにoauthを使用すると、ローカルユーザーとして保存することができますこれは最善のアプローチでなければならない...あるいは、ユーザーがoauth経由でログインしたときに混在したアプローチが必要な場合は、ローカルユーザーのいずれかと情報が関連しているかどうかをチェックします。 oauth情報をローカルアカウントに関連付けるかどうかを尋ね、トークン化されたURLを電子メールでローカルユーザーに送信して、その関連付けを承認するように求めます。ローカルユーザー>セキュリティのためのoauth。 – Hackerman

+0

それは私がそれを理解したようにも、これまで読んだことのあるすべての例がどのように働いているように見えるのではないかと思われます(.net core ...) – Paul

+0

これらのトピックについては、 ...私たちは通常、基本的なものを見つけるだけです... oauthパターンについて読んでから、ローカルユーザーとして保存するかどうかなど独自のデザイン決定を使用して独自のバージョンを作成し始めます。あなたのアプリを安全な状態に保ちながらローカルユーザーになる...これは読む価値があるhttps://tools.ietf.org/html/rfc6749 – Hackerman

答えて

0

私はそれがだけ LinkedInの認証のためのそれ自身のクッキーを落とすからミドルウェアを防ぐ「OnTicketReceived」のコードです...

 app.UseOAuthAuthentication(new OAuthOptions 
     { 
      AuthenticationScheme = "LinkedIn", 
      DisplayName = "LinkedIn", 

      ClientId = Configuration["linkedin:clientId"], 
      ClientSecret = Configuration["linkedin:clientSecret"], 

      CallbackPath = new PathString("/signin-linkedin"), 

      AuthorizationEndpoint = "https://www.linkedin.com/oauth/v2/authorization", 
      TokenEndpoint = "https://www.linkedin.com/oauth/v2/accessToken", 
      UserInformationEndpoint = "https://api.linkedin.com/v1/people/~:(id,formatted-name,email-address,picture-url)", 

      Scope = { "r_basicprofile", "r_emailaddress", "w_share" }, 
      Events = new OAuthEvents 
      { 
       OnTicketReceived = context => 
       { 
        // Indicate that we handled the login 
        context.HandleResponse(); 

        // Default redirect path is the base path 
        if (string.IsNullOrEmpty(context.ReturnUri)) 
        { 
         context.ReturnUri = "/"; 
        } 

        context.Response.Redirect(context.ReturnUri); 

        return Task.FromResult(0); 
       }, 

       OnCreatingTicket = async context => 
       { 
        // Retrieve user info 
        var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint); 
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken); 
        request.Headers.Add("x-li-format", "json"); // Tell LinkedIn we want the result in JSON, otherwise it will return XML 

        var response = await context.Backchannel.SendAsync(request, context.HttpContext.RequestAborted); 
        response.EnsureSuccessStatusCode(); 

// Do database stuff to find user using parameters provided through oauth 
// Perform identity sign in using sign in manager 
        await signInManager.SignInAsync(dbUser, false); 
       } 
      } 
     }); 

     app.Map("/login", builder => 
     { 
      builder.Run(async context => 
      { 
       // Return a challenge to invoke the LinkedIn authentication scheme 
       await context.Authentication.ChallengeAsync("LinkedIn", properties: new AuthenticationProperties() { RedirectUri = "/" }); 
      }); 
     }); 

いくつかの試行錯誤を介してこれを解決することができました。

関連する問題