IdentityServer4のユーザー名とパスワードで保護されたAPIへのアクセス

IdentityServer4の知人:1接続クライアントモード保護APIへのアクセスに導入し、。IdentityServer4のユーザー名とパスワード保護モードのAPIへのアクセスについてのこの記事。

  • ユーザーの追加:GetUsers、中コンフィグクラスIdentityServerプロジェクト内のメソッドを追加し、ユーザーを追加する必要があり、当然のユーザー名にパスワードを使用します。コレクションを返すtestuserという。
    パブリック静的リスト<TESTUSER> GetUsersは、(){ 
            新しいリストを返す<TESTUSER>()
            { 
                新しいtestuserを()
                { 
                    //用户名
                     ユーザ名= "apiUser"、
                     //密码
                     パスワード= "apiUserPassword"、
                     //用户イド
                     SubjectId =」 0" 
                } 
            }。
        }

また、ユーザーはIdentityServerプロジェクトスタートアップの種類ConfigureServices方法を変更し、あなたがIdentityServer4に登録する良いユーザーを追加する必要があります

 

空ConfigureServicesパブリック(IServiceCollectionサービス)
        { 
            services.AddMvc(); 
            //追加IdentityServerの
            VAR = services.AddIdentityServerビルダー()
                //アイデンティティ承認されたリソースの
                .AddInMemoryIdentityResources(Config.GetIdentityResources()) 承認されたリソースのに// APIアクセス
                .AddInMemoryApiResources( Config.GetApis())
                //クライアント
                .AddInMemoryClients(Config.GetClients())
                //ユーザーの追加
                .AddTestUsers(Config.GetUsersを()); 
            IF(Environment.IsDevelopment())
            {  
                builder.AddDeveloperSigningCredential()を。
            }  
            { 
                (「キーマテリアルを設定する必要があります」)新しい例外を投げます。
            } 
        }
  • モードにアクセスするためのクライアント、ユーザー名とパスワードを追加します。クライアントがアクセスされたモードの種類、GrantTypes.ClientCredentialsクライアント証明書モード、ユーザー名とパスワードのGrantTypes.ResourceOwnerPasswordモードすることができ決定財産のAllowedGrantTypesで定義されたクライアント(クライアント)。ユーザー名とパスワードをクライアント・モードのサポートを追加する必要があるので、クライアント証明書モードにクライアントを追加します。
静的IEnumerableを公共<クライアント> GetClients()
        { 
            新しい新しいクライアントを返す[] { 
              
                新しい新しいクライアント()
                { 
                    //クライアントID 
                     ClientIdを= "apiClientCd"、
                     //クライアントのパスワード
                     ClientSecrets = {新しいシークレット( "apiSecret " .Sha256() )}、
                     //クライアント認証タイプ、ClientCredentials:クライアントの資格情報の実施形態
                     AllowedGrantTypes = GrantTypes.ClientCredentials、
                     //リソースへのアクセスを許可する
                     AllowedScopes = { 
                        "secretapi" 
                    } 
                }、 
                新しい新しいクライアント()
                { 
                    //クライアントID 
                     ClientIdを= "apiClientPassword"、
                     //クライアントのパスワードの
                     新しいclientSecrets新しいシークレット= {( "apiSecret" .Sha256())}、
                     //クライアント認証タイプ、ClientCredentials:クライアントの資格情報は、実施の形態
                     AllowedGrantTypes = GrantTypes。 ResourceOwnerPasswordは、
                     //リソースへのアクセスを許可
                     AllowedScopes = { 
                        "secretapi" 
                    } 
                } 

            }; 
        }

この時点で、サーバが完了しています。IentityApiプロジェクトを移動します。

  • バックグラウンドでのトークンの取得は:IdentityModelは、ユーザー名とパスワードのモデルをサポートするために、HttpClientをは、拡張メソッドを作った:RequestPasswordTokenAsyncは、IdentityControllerコントローラ入手トークン・インターフェースを変更し、それがユーザー名とパスワードトークン取得モードをサポートしています
[HTTPGET] 
        [ルート( "API /入手トークン")] 
        パブリックタスク<オブジェクト> GetCdTokenAsync(文字列型、ブール要求?)非同期
        { 
            VARクライアント=新しいHttpClientを()。
            VaRのディスコ=がclient.GetDiscoveryDocumentAsyncを待つ( "のhttp:// localhostを:5000"); 
            TokenResponse RESP = NULL; 
            スイッチ(タイプ)
            { 
                場合、 "CD":
                    RESP = client.RequestClientCredentialsTokenAsync(新しいClientCredentialsTokenRequest待つ
                    { 
                        //获取トークン的地址
                        アドレス= disco.TokenEndpointを、
                        //客户端同上 
                        ClientIdを= "apiClientCd"、
                        //クライアントのパスワード
                        ClientSecret = "apiSecret"、
                        アクセスリソースへのAPIは、// 
                        範囲= "secretapi" 
                    }); 
                    BREAK; 
                ケース"パス":
                    RESPはのawait client.RequestPasswordTokenAsync(新しい新しいPasswordTokenRequestを()= 
                    { 
                        //トークンを取得アドレス
                        アドレス= disco.TokenEndpoint、
                        //クライアントイド
                        ClientIdを= "apiClientPassword"、
                        //クライアントのパスワードを
                        ClientSecret = "apiSecret"、
                        //リソースにアクセスするためのAPI 
                        スコープ= "secretapi"、
                        //ユーザ名
                        ユーザー名= "apiUser"、
                        //パスワード
                        パスワード= "apiUserPassword" 
                    }); 
                    BREAK; 
            } 
//要求が真である場合、トークンは直接保護アクセスAPI IF(偽RESPに??要求= NULL &&!) {
          //追加ベアラ認証ヘッダー client.SetBearerToken(resp.AccessToken); インクルードがclient.GetStringAsyncを待つVAR = reslut( "HTTPS:// localhostを:5001 / API /アイデンティティ"); JArray = JArray.Parse JSON(reslut); JSONを返す; } 戻りRESPの.jsonを;? }

  

 

  • 同様に、HTTPリクエストをすることによって得ることができます

 

 トークンを取得した後、クライアントAPIと同じを通じて、保護モードにアクセスします。

 これまでのところ、昨日と付け加え、APIにアクセスできるようにする場合にのみ、これらの2つのモードの違いだ何かを見つけるためにまだ持って、それを何の違い、ユーザー名とパスワードを入力せずに。APIアクセスデータは、昨日は、トークンを達成し、これらの二つのモードを比較した後に返された、それ以上にクレームユーザー名・パスワードモードリターンの数で見つけることができます。それが何であるかを主張し、ジェーン・クー、要求者はトークン内の情報の一部に含まれています。しかし、クライアントモードは、ユーザ情報を必要としないので、クレームリターンの数が少なくなります。TESTUSERは、請求項が自分を追加することができますプロパティがある主張でIdentityServer4では、ClaimTypes列挙リストを直接添加することができる請求があります。ClaimTypes.Roleトライを追加します。

IdentityServer.Config.GetUsers

    パブリック静的リスト<TESTUSER> GetUsersは、(){ 
            新しいリストを返す<TESTUSER>()
            { 
                新しいtestuserを()
                { 
                    //用户名
                     ユーザ名= "apiUser"、
                     //密码
                     パスワード= "apiUserPassword"、
                     //用户イド
                     SubjectId =」 0" 、
                     請求=新しいリスト<項>(){ 
                         新項(ClaimTypes.Role、 "管理者")
                     } 
                } 
            }。
        }

そして、あなたがアクセスAPIを得る二つのプロジェクト、パスワードとユーザーパスワードモードトークンの使用を開始した場合、返される値は、まだ何の役割ではありません:クレームの管理者。その後、再びApiResouceを使用し、ApiResouceは、オーバーロードコンストラクタは、請求項のコレクションに渡すサポートし、APIリソースは、これらの請求を運ぶことを可能にするために使用することができるしています。

IdentityServer.Config.GetApis

静的IEnumerableを公共<ApiResource> GetApis()
        { 
            新しい新しいApiResource [] {返す
                // secretapi:表示名をカスタマイズすることができます:ID名、シークレットアピ
                新しいApiResource( "secretapi"、 " (秘密API"、新しいリスト<文字列> )} {ClaimTypes.Role)
            }; 
        }

あなたは今、あなたは、この役割は主張を返すようになっている見つけることができ、テストしIdentityApiとIdentityServer二つのプロジェクトを開始することができます。

 

 便利なこの主張の役割(ロール)は、シンプルな著作権管理を行うために使用することができます。

検証の役割をサポートするために、保護されたAPIをすべての修正の最初の

IdentityApi.Controllers.IdentityController.GetUserClaims

[HTTPGET] 
        [ルート( "API /アイデンティティ")] 
        [Microsoft.AspNetCore.Authorization.Authorize(ロール= "管理者")] 
        パブリックオブジェクトGetUserClaims()
        { 
            User.Claims.Selectを返す(R =>新しい{r.Type 、r.Value})。
        }

そして、IdentityServerエンドユーザーは、ゲストの役割を追加します

 IdentityServer.Config.GetUsers

パブリック静的リスト<TESTUSER> GetUsersは、(){ 
            新しいリストを返す<TESTUSER>()
            { 
                新しいtestuserを()
                { 
                    //用户名
                     ユーザ名= "apiUser"、
                     //密码
                     パスワード= "apiUserPassword"、
                     //用户イド
                     SubjectId =」 0" 、
                     請求=新しいリスト<項>(){ 
                         新項(ClaimTypes.Role、 "管理者")

                     } 
                }、
                 新しいTESTUSER()
                { 
                    //用户名
                     ユーザ名= "apiUserGuest"、
                     //密码
                     パスワード= "apiUserPassword"、
                     //用户イド
                     SubjectId = "1"、
                     請求=新しいリスト<項>(){ 
                         新項(ClaimTypes.Role、 "ゲスト")
                     } 
                } 
            }。
        }

戻るIdentityApiに、次のテスト・インタフェースを変更するには、ユーザー名とパスワードのパラメータ、便利なデバッグ

IdentityApi.Controllers.IdentityController.getCdTokenAsync

  

[HTTPGET] 
        [ルート( "API /入手トークン")] 
        パブリックタスクの<object> GetCdTokenAsync(文字列型、ブールリクエスト、文字列、ユーザー名、文字列のパスワード?)非同期
        { 
            VARクライアント=新しいHttpClientを(); 
            VaRのディスコ=がclient.GetDiscoveryDocumentAsyncを待つ( "のhttp:// localhostを:5000"); 
            TokenResponse RESP = NULL; 
            スイッチ(タイプ)
            { 
                場合、 "CD":
                    RESP = client.RequestClientCredentialsTokenAsync(新しいClientCredentialsTokenRequest待つ
                    { 
                        //获取トークン的地址
                        アドレス= disco.TokenEndpointを、
                        //客户端同上
                        = ClientIdを"apiClientCd"、
                        //クライアントのパスワード
                        ClientSecret = "apiSecret"、
                        //リソースにアクセスするためのAPI 
                        のスコープ= "secretapi" 
                    }); 
                    BREAK; 
                ケース"パスは":
                    RESPはのawait client.RequestPasswordTokenAsyncを=(新新PasswordTokenRequest()
                    { 
                        //トークンアドレス取得
                        アドレス= disco.TokenEndpoint、
                        //クライアントイド
                        ClientIdを= "apiClientPassword"、
                        //クライアントのパスワードを
                        = ClientSecret "apiSecret"、
                        アクセスリソースへのAPIは、// 
                        範囲= "secretapi"、
                        //ユーザー名
                        ユーザー名=ユーザー名、
                        //パスワード
                        パスワード=パスワード
                    }); 
                    BREAK; 
            } 
            (リクエスト?? = nullを&&偽RESP)IF!
            { 
                //ベアラ認証ヘッダ追加
                client.SetBearerToken(resp.AccessToken)を、
                VAR = reslutザはclient.GetStringAsync待つ( "HTTPS:// localhostを:5001 / API /アイデンティティ"); 
                JArray = JArray.Parse JSON(reslut)を、
                JSONを返します。
            } 
            戻りRESP .Json?。
        }

  apiUserとapiUserGuestで区切り訪問

 

 

 

 

 apiUserGuestアクセスが拒否されます。

 トップは、請求項に定義されたClaimTypes列挙を追加されますが、クレームではありません例えば、それを行う方法であるべきクレーム列挙体で定義されている場合、私は、すべてのユーザーがクレームの名前のPROGを追加するには、項目番号を持っていると思います。

まずApiResouceに名前prog.Claimで許可さ

IdentityServer.Config.GetApis

静的IEnumerableを公共<ApiResource> GetApis()
        { 
            新しい新しいApiResource [] {返す
                // secretapi:表示名をカスタマイズすることができます:ID名、シークレットアピ
                新しいApiResource( "secretapi"、 " (秘密API"、新しいリスト<文字列> ){ClaimTypes.Role、ClaimTypes.Name、 "PROG"})
            }; 
        }

内のユーザー定義属性の特許請求の範囲にPROG情報を追加します。

IdentityServer.Config。

GetUsers
    パブリック静的リスト<TESTUSER> GetUsersは、(){ 
            新しいリストを返す<TESTUSER>()
            { 
                新しいtestuserを()
                { 
                    //用户名
                     ユーザ名= "apiUser"、
                     //密码
                     パスワード= "apiUserPassword"、
                     //用户イド
                     SubjectId =」 0" 、
                     請求=新しいリスト<項>(){ 
                         新項(ClaimTypes.Role、 "管理者")、
                         新たなクレーム( "PROG"、 "正式项目")

                     } 
                }、
                 新しいTESTUSER()
                {
                    //用户名
                     ユーザー名= "apiUserGuest"、
                     //密码
                     パスワード= "apiUserPassword"、
                     //用户イド
                     SubjectId = "1"、
                     請求=新しいリスト<項>(){ 
                         新項(ClaimTypes.Role、 "ゲスト") 、
                         新しいクレーム( "PROG"、 "测试项目")
                     } 
                } 
            }。
        }

 apiUserアクセス​​を使用してください

 認証コードと隠しモード:ユーザーパスワードとパスワードのモードは、これらの2つのモードは、IdentityResourceのConfigクラスでも、それは彼らがそれを使用するために何が起こっているか、費やすことを気にしなかった、他の二つのモードについて、次のセクションの話を終えについて話しましたモードは、それを使用します。

 

おすすめ

転載: www.cnblogs.com/liujiabing/p/11460486.html