在 ASP.NET 核心中找不到 ClientAssertionCertificate

Can't find ClientAssertionCertificate in ASP.NET Core

我有一个 ASP.NET 核心应用程序,我正在尝试使用证书从 AAD 获取访问令牌。我正在使用 3.13.5.907 版的 Microsoft.IdentityModel.Clients.ActiveDirectory 程序集。但似乎 ClientAssertionCertificate class 已从此程序集中删除。接口 IClientAssertionCertificate 可用,但我找不到任何正在实现它的 class。

在 ASP.NET 4.5 中,我曾经使用以下代码使用证书从 AAD 获取访问令牌(Microsoft.IdentityModel.Clients.ActiveDirectory 版本 3.13.4.878 的程序集)

var clientCredential = new ClientAssertionCertificate(_appId, _thumbprint);
var authenticationContext = new AuthenticationContext(authority, false);
var result = await authenticationContext.AcquireTokenAsync(resource, clientCredential);

这个 class 在 ASP.NET Core 中贬值了吗?还是我遗漏了什么?

我今天遇到了同样的问题;事实证明,编写自己的 IClientAssertionCertificate

具体实现非常容易
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.IdentityModel.Tokens;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace app{

    internal class ClientAssertionCertificate : IClientAssertionCertificate {

        private X509Certificate2 certificate;
        public string ClientId { get; private set; }

        public string Thumbprint {
            get {
                return Base64UrlEncoder.Encode(certificate.GetCertHash());
            }
        }

        public ClientAssertionCertificate(string clientId, X509Certificate2 certificate) {
            ClientId = clientId;
            this.certificate = certificate;
        }

        public byte[] Sign(string message) {
            using (var key = certificate.GetRSAPrivateKey()) {
                return key.SignData(Encoding.UTF8.GetBytes(message), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
            }
        }
    }
}

除了引用包 Microsoft.IdentityModel.Clients.ActiveDirectory,您还需要添加包 Microsoft.IdentityModel.Tokens(对于 Base64UrlEncoder)

来源:https://blog.mastykarz.nl/azure-ad-app-only-access-token-using-certificate-dotnet-core/

只是更新给现在看到这个 post 的人。现在在最新的 .NETStandard 2.0 版本中可用。