Secrets

特定の状況では、クライアントはidentityserverで認証する必要があります。

  • トークンエンドポイントでトークンを要求する機密アプリケーション(別称クライアント)
  • イントロスペクションエンドポイントで参照トークンを検証するAPI

その目的のために、秘密のリストをクライアントまたはAPIリソースに割り当てることができます。

秘密の解析と検証は、アイデンティティサーバーの拡張ポイントです。これは、共有秘密をサポートするだけでなく、基本認証ヘッダーまたはPOST本体を介して共有秘密情報を送信することも可能です。

共有秘密の作成

次のコードは、ハッシュ共有秘密を設定します。

var secret = new Secret("secret".Sha256());

このシークレットをa Clientまたはaのいずれかに割り当てることができるようになりましたApiResource。両方が単一のシークレットをサポートするだけでなく、複数のシークレットをサポートすることに注意してください。これは、秘密のロールオーバーとローテーションに便利です。

var client = new Client
{
    ClientId = "client",
    ClientSecrets = new List<Secret> { secret },

    AllowedGrantTypes = GrantTypes.ClientCredentials,
    AllowedScopes = new List<string>
    {
        "api1", "api2"
    }
};

実際には、秘密情報に説明と有効期限を割り当てることもできます。説明はロギング、および秘密のライフタイムを実施するための有効期限に使用されます。

var secret = new Secret(
    "secret".Sha256(),
    "2016 secret",
    new DateTime(2016, 12, 31));

共有秘密を使った認証

POSTボディの一部としてクライアントID /シークレットの組み合わせを送信することもできます。

POST /connect/token

client_id=client1&
client_secret=secret&
...

..または基本認証ヘッダーとして:

POST /connect/token

Authorization: Basic xxxxx

...

次のC#コードを使用して基本認証ヘッダーを手動で作成できます。

var credentials = string.Format("{0}:{1}", clientId, clientSecret);
var headerValue = Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials));

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", headerValue);

IdentityModelのライブラリが呼び出されるヘルパークラスを持っているTokenClientし、IntrospectionClientそれは両方の認証プロトコルメッセージをカプセル化します。

共有秘密を越えて

クライアントを認証するには、公開/秘密鍵暗号化などの方法があります。IdentityServerには、秘密鍵JWTクライアントの秘密(RFC 7523を参照)のサポートが含まれています。

秘密の拡張性は、通常、次の3つから構成されます。

  • 秘密の定義
  • 入ってくるリクエストから秘密を引き出す方法を知っている秘密のパーサ
  • 定義に基づいて解析された秘密を検証する方法を知っている秘密のバリデータ

シークレットパーサーとバリデーターは、ISecretParserとISecretValidatorインターフェースの実装です。それらをIdentityServerで使用できるようにするには、それらをDIコンテナに登録する必要があります。

builder.AddSecretParser<JwtBearerClientAssertionSecretParser>()
builder.AddSecretValidator<PrivateKeyJwtSecretValidator>()

私たちのデフォルトの秘密鍵JWT秘密のバリデータは、完全な(リーフ)証明書が秘密の定義のbase64として期待しています。この証明書は、自己署名されたJWTの署名を検証するために使用されます。

var client = new Client
{
    ClientId = "client.jwt",
    ClientSecrets =
    {
        new Secret
        {
            Type = IdentityServerConstants.SecretTypes.X509CertificateBase64,
            Value = "MIIDATCCAe2gAwIBAgIQoHUYAquk9rBJcq8W+F0FAzAJBgUrDgMCHQUAMBIxEDAOBgNVBAMTB0RldlJvb3QwHhcNMTAwMTIwMjMwMDAwWhcNMjAwMTIwMjMwMDAwWjARMQ8wDQYDVQQDEwZDbGllbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSaY4x1eXqjHF1iXQcF3pbFrIbmNw19w/IdOQxbavmuPbhY7jX0IORu/GQiHjmhqWt8F4G7KGLhXLC1j7rXdDmxXRyVJBZBTEaSYukuX7zGeUXscdpgODLQVay/0hUGz54aDZPAhtBHaYbog+yH10sCXgV1Mxtzx3dGelA6pPwiAmXwFxjJ1HGsS/hdbt+vgXhdlzud3ZSfyI/TJAnFeKxsmbJUyqMfoBl1zFKG4MOvgHhBjekp+r8gYNGknMYu9JDFr1ue0wylaw9UwG8ZXAkYmYbn2wN/CpJl3gJgX42/9g87uLvtVAmz5L+rZQTlS1ibv54ScR2lcRpGQiQav/LAgMBAAGjXDBaMBMGA1UdJQQMMAoGCCsGAQUFBwMCMEMGA1UdAQQ8MDqAENIWANpX5DZ3bX3WvoDfy0GhFDASMRAwDgYDVQQDEwdEZXZSb290ghAsWTt7E82DjU1E1p427Qj2MAkGBSsOAwIdBQADggEBADLje0qbqGVPaZHINLn+WSM2czZk0b5NG80btp7arjgDYoWBIe2TSOkkApTRhLPfmZTsaiI3Ro/64q+Dk3z3Kt7w+grHqu5nYhsn7xQFAQUf3y2KcJnRdIEk0jrLM4vgIzYdXsoC6YO+9QnlkNqcN36Y8IpSVSTda6gRKvGXiAhu42e2Qey/WNMFOL+YzMXGt/nDHL/qRKsuXBOarIb++43DV3YnxGTx22llhOnPpuZ9/gnNY7KLjODaiEciKhaKqt/b57mTEz4jTF4kIg6BP03MUfDXeVlM1Qf1jB43G2QQ19n5lUiqTpmQkcfLfyci2uBZ8BkOhXr3Vk9HIk/xBXQ="
        }
    },

    AllowedGrantTypes = GrantTypes.ClientCredentials,
    AllowedScopes = { "api1", "api2" }
};

独自の秘密のバリデーターを実装したり、独自のシークレット・バリデーターを実装して、チェーン信頼の検証などを実装することもできます。