2

OAuthとOpenIDConnectとaspnetコアミドルウェアで迷子になりました。これについての助けに感謝します。Google OAuthを使用してaspnetコアのWebサービスを保護する

同じWebサービスセットを使用する複数のUI(Web、ネイティブアプリ)があります。認証されたユーザーだけがWebサービスにアクセスできるようにしたいと考えています。私の組織ではGoogleアカウントを使用しているため、組織のドメインに限定したGoogle認証を使用したいと考えています。

this sampleのWebサイトでは、認証が適切に要求されています。私が今必要とするのは、Webサイト(AngularJS 4)にバックエンドのWebサービスを、Googleと確認できる認証トークンで呼び出させることです。

バックエンドサービスはaspnetコアで書かれています。私はこれらのアプローチを使用して試しました:Google middlewareGoogle OpenIDConnectしかし、これらはまだ1)認証されていないユーザーにログインを促すUIがあり、2)Cookieベースであると思われ、 Webサービス呼び出し。

この場合の「ユーザー」はソフトウェアクライアントであるため、ユーザーにログインを促す必要はありません。どちらかが認証されているか、まだ認証されていません。私はちょうど認証トークンを取得し、それを検証し、実行する必要があります。

This appears to be the same questionまだ回答がありません。

ご迷惑をおかけして申し訳ございません。また、ネイティブアプリを持つことに関する提案やヒントも同じです!

答えて

3

は作業それを手に入れました。前述のように、私は迷子にして、溶液として、いくつかの分野で参照されてもOpenIDConnectは、Webサービスのための赤いニシンでした。ここで私が提供できるよう、完全な手順で、今私のために働いているものです(一部のクリーンアップが必要):

  1. UI following these directions
  2. 各WebサービスでトークンJWT as shown in the first segment here
  3. を取得するために認証を追加します

    名:認証

    値:ベアラ{トークン値}

  4. 0呼び出し、ヘッダ内のJWTトークンを含みます
  5. は)(あなたの後に、WebサービスでのスタートアップのConfigureServices方法でAddMvcをJwtBearer NuGet package

  6. をインストールします。

    services.AddAuthorization(options => 
    { // this policy needed only if you want to restrict to accounts within your domain. otherwise, don't use options. or use whatever options work for you. 
         options.AddPolicy("hd", 
          policy => policy.RequireAssertion(context => 
           context.User.HasClaim(c => 
            c.Type == "hd" && 
            ("https://accounts.google.com".Equals(c.Issuer) || 
            "accounts.google.com".Equals(c.Issuer, StringComparison.CurrentCultureIgnoreCase)) && 
            c.Value == "yourdomain.com" 
           ))); 
    }); 
    
  7. を設定する方法では、あなたの前にUseMvcを():

     JwtBearerOptions jwtOptions = new JwtBearerOptions(); 
         jwtOptions.Audience = "{the OAuth 2.0 client ID credential from google api developer console}"; 
         jwtOptions.Authority = "https://accounts.google.com"; 
         jwtOptions.TokenValidationParameters = new TokenValidationParameters(); 
         jwtOptions.TokenValidationParameters.ValidIssuers = new List<string>() 
         { 
          "https://accounts.google.com", 
          "accounts.google.com" 
         }; 
    
         app.UseJwtBearerAuthentication(jwtOptions); 
    

おそらく、これを行うためのより適切な方法があります。もしあれば、私はinteresですそれを試してみてください。今のところ、これは動作しています。

0

私は助けようとします。

まず、OAuth 2.0 NOT an Authentication protocolを覚えておいて、OpenID Connect(OAuth 2.0の上に構築されています)を調べる必要があります。

1)あなたにはUIがあると仮定します。 Googleサービスを使用していると仮定して、ログインにUIは必要ありません。 の存在を確認し、のアクセストークン、アイデンティティトークン(および場合によってはリフレッシュトークン)を検証する必要があります。トークンがない場合は、ユーザーが認証されていないとみなし、承認要求を使用して認証サーバーにそれらをリダイレクトします。

有効なアクセストークンとリフレッシュトークンがある場合、そのユーザーは認証済みであるとみなすことができます。

あなたはまた、彼らはあなたの特定のアプリケーションのために許可されているかどうかを判断するために、適切な「スコープ」のためのアクセストークンを調べることができます。

あなたが認証サーバーは、Googleを使用している場合は、IDトークン内validate the the hd parameterできる希望のドメインを持っています。ところで

:関与なしクッキー。

希望に役立ちます。

+0

ありがとう、私は概念と流れ(私は考える)を理解しています。私が抱えている問題は、これまでに見つけたすべてのミドルウェアが、ログイン用のUIを使用することを前提としているということです。すでに*ログイン済みのクライアントを持つ方法の例やドキュメントが見つかりませんでした。 Webサービスコールを使用してサーバ側で正しいトークン*を検証する*。コントローラーで[Authorize]属性を使用し、正しいミドルウェアでGoogleに適切なトークンを検証させたいと思います。それを行うために私自身のミドルウェアを書かなければならないのですか、それともすでに存在していますか? – Celeste

+0

私は理解していないと思います。 OAuthとOIDCには4人のプレーヤーがいます。リソースオーナー(ユーザ)とOAuthクライアント(アプリケーション)、OIDCプロバイダ(あなたの例ではGoogle)、リソースサーバ(保護されたリソースを保持している)あなたは、あなたが言っている「すでにログインしているクライアント」と言っていますか?一般に、OAuthクライアントは、返されたトークンの検証を実行して、改ざんされておらず、真のOIDCプロバイダから返されたものであることを保証することが期待されます。これには多くのライブラリが使用されています(SHOULD)。 – jwilleke

+0

私に辛抱強く感謝しています。 OAuthクライアントは2つあります:Web UIとWebサービスです。これらは同じプロセスの一部として実行されていません。彼らは別のサーバーで実行されています。ウェブUIは、Googleのjavascriptライブラリを使用してOAuthプロセス全体を処理できます。それが完了すると、ユーザーはWeb UIを使用できるようになり、さまざまなWebサービスが呼び出されます。したがって、UIは、Webサービス呼び出しに含める必要のある種類のトークンを取得しており、Webサービスはそのトークンを検証する必要があります。 – Celeste

関連する問題