2

私は、OpenIDictを使用して/ connect/tokenのエンドポイントで.NET CORE APIプロジェクトである1つのプロジェクト(プロジェクトA)を所有し、JWTトークンを発行して、このプロジェクトは素晴らしい作品です。.NET CORE API OpenIDict/Identityを使用してFacebookログインを行う

私は別のプロジェクト(プロジェクトB)を持っています。これは非常に単純なプロジェクトで、APIにアクセストークンを取得してAPIからデータを取得するようにHTMLに要求しています。このプロジェクトは素晴らしい作品です。

ここで私の頭脳を包み込むことができない部分は、どうやってこの2つの全く別々のプロジェクト間でFacebookのログインを使用しますか?私はすべてが1屋根の下にあるなら、それを使用する方法を知っています、そして、それは本当に簡単ですが、このシナリオは、すべてが分かれているので、私は完全に混乱しています。ですから、ExternalLogin、ExternalLoginCallBackロジック(個々のアカウントを使用して.NET Webテンプレートから)、APIを処理する初心者にとっては、 HTMLプロジェクトですか? Facebookに接続するときに、どのURLをリダイレクトする必要がありますか(API/HTMLプロジェクト)?その後、誰が 'Startup.cs'ファイルに以下のコードを入れるべきですか?

STARTUP.CS(API)

ます。public void ConfigureServices機能::(API)

// add entity framework using the config connection string 
      services.AddEntityFrameworkSqlServer() 
       .AddDbContext<ApplicationDbContext>(options => 
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

      // add identity 
      services.AddIdentity<ApplicationUser, ApplicationRole>() 
       .AddEntityFrameworkStores<ApplicationDbContext>() 
       .AddDefaultTokenProviders(); 

      // add OpenIddict 
      services.AddOpenIddict<ApplicationUser, ApplicationRole, ApplicationDbContext>() 
       .DisableHttpsRequirement() 
       .EnableTokenEndpoint("/connect/token") 
       .AllowPasswordFlow() 
       .AllowRefreshTokenFlow() 
       .UseJsonWebTokens() 
       .AddEphemeralSigningKey(); 

      services.AddCors(); 

app.UseFacebookAuthentication(new FacebookOptions 
{ 
    AppId = "xxxxxxx", 
    AppSecret = "xxxxxxxxx", 
    Scope = { "email", "user_friends" }, 
    Fields = { "name", "email" }, 
    SaveTokens = true, 
}); 

そして最後に、これはここに役立ちます場合は、私がプロジェクトA現在設定している方法です

public void Configure関数:(API)

app.UseJwtBearerAuthentication(new JwtBearerOptions 
       { 
        AutomaticAuthenticate = true, 
        AutomaticChallenge = true, 
        RequireHttpsMetadata = false, 
        Audience = "http://localhost:54418/", 
        Authority = "http://localhost:54418/" 
       }); 

認証コントローラ(API)

public class AuthorizationController : Controller 
    { 
     private OpenIddictUserManager<ApplicationUser> _userManager; 

     public AuthorizationController(OpenIddictUserManager<ApplicationUser> userManager) 
     { 
      _userManager = userManager; 
     } 

     [HttpPost("~/connect/token")] 
     [Produces("application/json")] 
     public async Task<IActionResult> Exchange() 
     { 
      var request = HttpContext.GetOpenIdConnectRequest(); 

      if (request.IsPasswordGrantType()) 
      { 
       var user = await _userManager.FindByNameAsync(request.Username); 
       if (user == null) 
       { 
        return BadRequest(new OpenIdConnectResponse 
        { 
         ErrorDescription = "The username or password provided is incorrect" 
        }); 
       } 

       var identity = await _userManager.CreateIdentityAsync(user, request.GetScopes()); 

       // Add a custom claim that will be persisted 
       // in both the access and the identity tokens. 
       if (user.Avatar != null) 
       { 
        identity.AddClaim("user_avatar", user.Avatar, 
         OpenIdConnectConstants.Destinations.AccessToken, 
         OpenIdConnectConstants.Destinations.IdentityToken); 
       } 

       if (user.InSiteUserName != null) 
       { 
        identity.AddClaim("insite_username", user.InSiteUserName, 
        OpenIdConnectConstants.Destinations.AccessToken, 
        OpenIdConnectConstants.Destinations.IdentityToken); 
       } 


       identity.AddClaim("hasLoggedIn", user.HasLoggedIn.ToString(), 
       OpenIdConnectConstants.Destinations.AccessToken, 
       OpenIdConnectConstants.Destinations.IdentityToken); 


       // Create a new authentication ticket holding the user identity. 
       var ticket = new AuthenticationTicket(
        new ClaimsPrincipal(identity), 
        new AuthenticationProperties(), 
        OpenIdConnectServerDefaults.AuthenticationScheme); 

       ticket.SetResources(request.GetResources()); 
       ticket.SetScopes(request.GetScopes()); 

       return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme); 
      } 

      return BadRequest(new OpenIdConnectResponse 
      { 
       Error = OpenIdConnectConstants.Errors.UnsupportedGrantType, 
       ErrorDescription = "The specified grant type is not supported." 
      }); 
     } 



    } 
} 

それは裸/かなり基本的だとすべてのためのAPIに依存しているので、それがプロジェクトBから何かを含めていた場合、私は知りません。

私はこれが読み込まれ複雑な質問であることを知っています。私はそれをできるだけ流動的に提示していないと確信していますので、私は前に言ったように、前もって謝ります。ありがとうございました!

+0

私はOpenIdDictを個人的に使っていませんが、理論的には最終的なアイデンティティを発行しているプロジェクトであるため、Apiプロジェクトでfacebook authを設定する必要があります。 HTMLプロジェクトはアイデンティティを消費するだけです。 OpenIdDictには、外部のアイデンティティプロバイダを含めるための何らかの方法が必要です。アイデンティティサーバはトークンサーバでもあります。私は、これがいくらか動作するなら、トークンサービスがプロバイダ名を必要とすると推測しています。 –

+1

[examples](https://github.com/openiddict/openiddict-samples)をご覧ください。あなたはこのライブラリの作成者から助けを得ることができるようにタグを編集しました – tmg

+0

@tmgタグを更新してくれてありがとう! – Pinpoint

答えて

0

ここで私は脳を囲むことができません。これら2つの全く別々のプロジェクトの間でFacebookログインを使用するにはどうすればよいですか?私はすべてが1屋根の下にあるなら、それを使用する方法を知っています、そして、それは本当に簡単ですが、このシナリオは、すべてが分かれているので、私は完全に混乱しています。ですから、ExternalLogin、ExternalLoginCallBackロジック(個々のアカウントを使用して.NET Webテンプレートから)、APIを処理する初心者にとっては、 HTMLプロジェクトですか?推奨場合

(認証コードフローまたは暗黙的な流れのようなインタラクティブなフローを使用している場合、すなわち)、認証サーバープロジェクト自体が社会のプロバイダにあなたを使用して、外部認証ダンスを処理する責任があります」あなたのASP.NET Coreパイプラインで設定されています。

理論上、最終的なクライアントアプリケーション(JSアプリケーション)は、FacebookやGoogleに直接リンクされていないため、認証サーバーレベルで外部認証を使用することを決定したことさえ知りません。

この場合、Facebookオプションで設定されたredirect_uriは、承認サーバーアプリケーションが所有するエンドポイントに対応する必要があります(あなたのケースでは、Facebook認証ミドルウェアによって提供されています)。


あなたは、このアプローチが気に入らない場合は、「アサーション助成金」という名前の別の流れは基本的に物事を処理する方法を逆にすることにもあります:最終クライアントアプリ(あなたのケースでJSアプリ)がありますFacebookに直接リンクされているので、redirect_uriはJSアプリに対応している必要があります。OpenIddictのトークンエンドポイントを使用して自分のサーバーで発行されたトークンとFacebookトークンを交換します。

このフローの詳細については、Exchanging a google idToken for local openId token c#を参照してください。

関連する問題