ADAL - ClientAssertionCertificate

ADAL - ClientAssertionCertificate

我们可以使用以下代码成功获取token:

var certificate = Certificate.Load("Client.pfx", "notasecret");
var authenticationContext = new AuthenticationContext(authority);
var clientAssertionCertificate = new ClientAssertionCertificate(clientId, certificate);
return await authenticationContext.AcquireTokenAsync(resource, clientAssertionCertificate);

令牌似乎不包含任何我们可以用来识别客户端身份的信息。在我们的用例中,我们有很多守护进程服务客户端与 API 通信。我们需要在服务器上提供一些唯一标识。

我还尝试创建我们自己的 JWT 令牌并添加了一些 public 声明,例如名称。但是在使用以下代码片段请求客户端断言类型后

var content = new FormUrlEncodedContent(new Dictionary<string, string>
             {
                 { "clientid", clientId },
                 { "resource", resource },
                 { "client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" },
                 { "grant_type", "client_credentials" },
                 { "client_assertion", jwt }
             });
             var httpClient = new HttpClient
             {
                 BaseAddress = new Uri("https://login.windows.net/{guid}/")
             };
             var response = await httpClient.PostAsync("oauth2/token", content);

return 令牌有 none 我的自定义信息。

问题:有没有办法使用 ClientAssertionCertificate 流程传递自定义声明?其中令牌 returned 包含更多信息。

目前无法在为应用程序颁发的令牌中添加自定义声明。 您收到的令牌应包含声明 appid(标识请求令牌的应用程序的 client_id)和 tid(指示应用程序正在运行的 azure AD 租户)。这两个应该足以让您识别调用应用程序。现在,如果您想要识别 process 而不是应用程序(例如,服务器 A 上的应用程序 X 运行 实例和服务器 A 上的应用程序 X 运行 实例服务器 B) 那么我不相信我们今天在 Azure AD 中有任何东西可以帮助您区分两者 - 对于 Azure AD,如果它们具有相同的 client_id 和秘密,它们就是相同的应用程序。