0

私は、asp.net WebAPIのフロントエンドとバックエンドAPIとして角度のあるプロジェクトに取り組んでいます。ホストされているOpenId接続サーバー(mitreid)があり、認証と承認にそのサーバーを使用する必要があります。mitreId openidサーバを角型と.net webapiアプリケーションで使用する

私は、.NET WebAPIのにはOpenID Connectサーバー認証を設定しようとしています、 これは私が

以下のような、でもコンフィギュレーションを設定しようとしたWebAPIの

のStartUp.csに
app.SetDefaultSignInAsAuthenticationType("OpenIdConnect"); 
app.UseOpenIdConnectAuthentication(
       new OpenIdConnectAuthenticationOptions 
       { 
        ClientId = "some_client", 
        ClientSecret = "some_secret", 
        Authority = "http://localhost:8181/openid-connect-server-webapp",      
        UseTokenLifetime = true, 
        ResponseType = "code", 
        Scope = "openid email", 
        SignInAsAuthenticationType = "OpenIdConnect", 
        TokenValidationParameters = new TokenValidationParameters 
        { 
         ValidateIssuer = false, 
         ValidateAudience = false 
        }, 
        Notifications = new OpenIdConnectAuthenticationNotifications() 
        { 
         AuthorizationCodeReceived = (context) => 
         { 
          var code = context.Code; 
          return Task.FromResult(0); 
         }, 
         RedirectToIdentityProvider = async n =>      
         { 
          n.ProtocolMessage.RedirectUri = "http://localhost:54464/"; 
          n.OwinContext.Authentication.Challenge(new String[] { "OpenIdConnect" }); 
         }, 
         SecurityTokenValidated = (n) => 
         { 
          var nid = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType, "user", "user");         
          nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken)); 
          nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));  
          nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString())); 
          nid.AddClaim(new Claim("app_specific", "some data")); 
          n.AuthenticationTicket = new AuthenticationTicket(nid, n.AuthenticationTicket.Properties); 
          return Task.FromResult(0); 
         }, 
         SecurityTokenReceived = (context) => 
         { 
          var code = context;  
          return Task.FromResult(0); 
         }, 
         AuthenticationFailed = (context) => 
         { 
          //some redirect 
          context.HandleResponse(); 
          return Task.FromResult(0); 
         } 
        } 
       }); 

をやったものです

ConfigurationManager = 
new ConfigurationManager<OpenIdConnectConfiguration> 
    ("http://localhost:8181/openid-connect-server-webapp/.well-known/openid-configuration"), 
Configuration = new OpenIdConnectConfiguration 
{ 
    Issuer = "http://localhost:8181/openid-connect-server-webapp", 
    AuthorizationEndpoint = "http://localhost:8181/openid-connect-server-webapp/authorize", 
    TokenEndpoint = "http://localhost:8181/openid-connect-server-webapp/token", 
    UserInfoEndpoint = "http://localhost:8181/openid-connect-server-webapp/userinfo" 
}, 

APIを(ポート54464で)デバッグしようとすると、コントローラにauthorize attrを置くと、OpenIDログインページにリダイレクトされ、ログインに成功してコントローラアクションが実行されません。 これは最初に呼び出したAPIの http://localhost:54464/api/common/getlistを最初に呼び出しているAPI呼び出しで、JSON配列を返す代わりにhttp://localhost:54464/api/common/getlist/?code=V7KFPZ&state=OpenIdConnect.AuthenticationProperties%3D****somecode****にリダイレクトするとします。

成功した郵便配達員から上記のリダイレクトされたURLのコードを使用してベアラトークンを生成しようとしました。ただし、postmanを使用して認証ヘッダーでトークンを使用しようとすると、応答はOpenIDログインHTMLページになります。私は何かが欠けてる知っ

通知イベントの発行どれもRedirectToIdentityProvider

以外に実行されていないが、私はこれまでかなり新しいよ、私にそれらをポイントしてください。何か間違ったこと、設定ミス、OpenIdクライアントを実装しているソリューションを教えてください。

+0

認証コードフローを使用しています。あなたのAngularアプリケーションはスタンドアローンのSPAで、WebAPIアプリケーションと同じホスト名とポートでホストされていないとします。このようなシナリオでは、暗黙のフローがあります。 Angularアプリケーションはログイン自体を処理し、IDとアクセストークンを取得します。次に、アクセストークンをAPIに送信してリソースを取得します。私はクライアントライブラリとして 'oidc-client'(NPM)を使い、apiには' IdentityServer3.AccessTokenValidation'(NuGet)を使います。あなたがこの方向に行きたいなら、私に知らせてください。私は答えを提供します。 – mode777

+0

はい、このアプローチに関するいくつかの洞察を提供してください。 – NikhilGoud

答えて

1

上記のコメントに記載されているように、Authorization Codeフローは、AngularアプリケーションなどのJavascriptクライアントにはあまり適していません。

認証サーバ(Mitreid):私はMitreidについて何も知りませんが、あなたが持っているので、これはこれは、あなたが人気のライブラリとそれに近づくことができる方法である

暗黙のフローのための可能な設定を説明しクライアントアプリケーションをID some_clientで登録するか、既存のクライアント設定を変更してimplictフローを使用します。 Identity Serverのような実装では、アクセストークンをブラウザに渡すための追加パラメータが必要になります。また、http://YOUR_ANGULAR_APP/auth-callbackをリダイレクトURIとして登録するようにしてください。 WebApiアプリのスコープを登録して、アクセストークンを消費するようにすることもできます。 webapiというスコープがあると仮定します。また、JWTのリファレンストークンではないと仮定します。後者の場合、WebAPIの設定は若干異なります。

クライアント(角):NPM経由でインストールできるoidc-clientライブラリをお勧めします。チュートリアルでは角度をhttps://www.scottbrady91.com/Angular/SPA-Authentiction-using-OpenID-Connect-Angular-CLI-and-oidc-clientに統合する方法を説明します。私はあなたの例に応じて設定を更新:

export function getClientSettings(): UserManagerSettings { 
    return { 
     authority: 'http://localhost:8181/openid-connect-server-webapp', 
     client_id: 'some_client', 
     redirect_uri: 'http://YOUR_ANGULAR_APP/auth-callback', 
     post_logout_redirect_uri: 'http://YOUR_ANGULAR_APP/', 
     response_type:"id_token token", 
     scope:"openid email webapi", 
     filterProtocolClaims: true, 
     loadUserInfo: true 
    }; 
} 

角度のAppは、すべてが正常に働いていた場合IDトークンとアクセストークンをあなたに残しログイン手続きを開始します。 oidc-clientは、WebAPIアプリケーションへのすべての承認された要求に追加する必要があるアクセストークンを持つAuthorizationヘッダーも準備します。 oidc-clientは自動的にユーザークレームを読み込みます。

リソースサーバー(WebAPIアプリケーション):WebAPI側の実装は、アクセストークン検証ミドルウェアと[Authorize]属性を追加するだけで簡単です。プリAS.NETのコアアプリケーションの場合は、IdentityServer3.AccessTokenValidationを使用します。これはNuget経由でインストールできます。

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
     { 
      Authority = "http://localhost:8181/openid-connect-server-webapp", 
      RequiredScopes = "openid email webapi" 
     }); 

あなたがClaimsIdentityUserとしてJWTに含まれるクレームに基づいて取得する必要がありますあなたのWebAPIのに[Authorize]エンドポイントを追加した場合。

+0

これを試して戻ってきます。 問題は、openIdサーバーがトークン応答タイプを実装していないことです。 したがって、トークンを手動で検証する必要があります – NikhilGoud

関連する問題