Azure AD'den erişim belirteci almak için istemci onaylama kullanmaUse client assertion to get access tokens from Azure AD

GitHub Örnek kodGitHub Sample code

Arka planBackground

İstemci, Openıd Connect yetkilendirme kod akışı veya karma akışı kullanarak, bir erişim belirteci için yetki kodunu birbiriyle değiştirir.When using authorization code flow or hybrid flow in OpenID Connect, the client exchanges an authorization code for an access token. Bu adım sırasında istemci kendi sunucusuna kimlik doğrulaması gerekir.During this step, the client has to authenticate itself to the server.

Gizli anahtar

İstemci kimlik doğrulaması için bir yol, bir istemci gizli anahtarı kullanmaktır.One way to authenticate the client is by using a client secret. Bu nasıl [Tailspin Surveys] Surveys uygulama varsayılan olarak yapılandırılır.That's how the Tailspin Surveys application is configured by default.

İstemciden gelen örnek istek için bir erişim belirteci istenirken IDP aşağıda verilmiştir.Here is an example request from the client to the IDP, requesting an access token. Not client_secret parametresi.Note the client_secret parameter.

POST https://login.microsoftonline.com/b9bd2162xxx/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded

resource=https://tailspin.onmicrosoft.com/surveys.webapi
  &client_id=87df91dc-63de-4765-8701-b59cc8bd9e11
  &client_secret=i3Bf12Dn...
  &grant_type=authorization_code
  &code=PG8wJG6Y...

Gizli dizi değeri sızıntı değil emin olmak sahip yalnızca bir dize olduğundan.The secret is just a string, so you have to make sure not to leak the value. Kaynak denetimi dışında gizli tutmak için en iyi yöntem olacaktır.The best practice is to keep the client secret out of source control. Azure'a dağıtırken, gizli dizisinde depolayın bir uygulama ayarı.When you deploy to Azure, store the secret in an app setting.

Ancak, Azure aboneliğinize erişimi olan herkes uygulama ayarlarını görüntüleyebilir.However, anyone with access to the Azure subscription can view the app settings. Daha fazla var. her zaman bir dürtüsüne benzeri gizli anahtarları (örneğin, dağıtım betikleri) kaynak denetimine denetleyin ve bunları e-posta ile paylaşmak içinFurther, there is always a temptation to check secrets into source control (e.g., in deployment scripts), share them by email, and so on.

Ek güvenlik için kullandığınız [istemci onayı] yerine istemci gizli anahtarı.For additional security, you can use client assertion instead of a client secret. İstemci, istemci onayı ile belirteç isteği istemciden gelen kanıtlamak için bir X.509 sertifikası kullanır.With client assertion, the client uses an X.509 certificate to prove the token request came from the client. İstemci sertifikası web sunucusuna yüklenir.The client certificate is installed on the web server. Genellikle, hiç kimse yanlışlıkla emin olmak için bir istemci gizli anahtarı ortaya daha sertifikaya, erişimi kısıtlamak daha kolay olacaktır.Generally, it will be easier to restrict access to the certificate, than to ensure that nobody inadvertently reveals a client secret. Bir web uygulamasında sertifikaları yapılandırma hakkında daha fazla bilgi için bkz. sertifikaları kullanarak Azure Web siteleri uygulamalarındaFor more information about configuring certificates in a web app, see Using Certificates in Azure Websites Applications

İstemci onayı kullanarak bir belirteç isteğini şu şekildedir:Here is a token request using client assertion:

POST https://login.microsoftonline.com/b9bd2162xxx/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded

resource=https://tailspin.onmicrosoft.com/surveys.webapi
  &client_id=87df91dc-63de-4765-8701-b59cc8bd9e11
  &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
  &client_assertion=eyJhbGci...
  &grant_type=authorization_code
  &code= PG8wJG6Y...

Dikkat client_secret parametresi artık kullanılmamaktadır.Notice that the client_secret parameter is no longer used. Bunun yerine, client_assertion parametresi istemci sertifikası kullanılarak imzalanmış bir JWT belirteci içerir.Instead, the client_assertion parameter contains a JWT token that was signed using the client certificate. client_assertion_type Parametresi onaylama türünü belirten — bu durumda, JWT belirteci.The client_assertion_type parameter specifies the type of assertion — in this case, JWT token. Sunucu, JWT belirteci doğrular.The server validates the JWT token. JWT belirteci geçersiz belirteç isteği bir hata döndürür.If the JWT token is invalid, the token request returns an error.

Not

X.509 sertifikaları yalnızca istemci onayı biçiminde değildir; Azure AD tarafından desteklenmediği için biz üzerinde burada odaklanın.X.509 certificates are not the only form of client assertion; we focus on it here because it is supported by Azure AD.

Çalışma zamanında web uygulamasını sertifikayı sertifika deposundan okur.At run time, the web application reads the certificate from the certificate store. Sertifika, web uygulaması ile aynı makinede yüklü olmalıdır.The certificate must be installed on the same machine as the web app.

Surveys uygulamasını oluşturan yardımcı bir sınıf içeren bir ClientAssertionCertificate için geçirebileceğiniz AuthenticationContext.AcquireTokenSilentAsync uygulamasından bir belirteç almak için yöntemi Azure AD.The Surveys application includes a helper class that creates a ClientAssertionCertificate that you can pass to the AuthenticationContext.AcquireTokenSilentAsync method to acquire a token from Azure AD.

public class CertificateCredentialService : ICredentialService
{
    private Lazy<Task<AdalCredential>> _credential;

    public CertificateCredentialService(IOptions<ConfigurationOptions> options)
    {
        var aadOptions = options.Value?.AzureAd;
        _credential = new Lazy<Task<AdalCredential>>(() =>
        {
            X509Certificate2 cert = CertificateUtility.FindCertificateByThumbprint(
                aadOptions.Asymmetric.StoreName,
                aadOptions.Asymmetric.StoreLocation,
                aadOptions.Asymmetric.CertificateThumbprint,
                aadOptions.Asymmetric.ValidationRequired);
            string password = null;
            var certBytes = CertificateUtility.ExportCertificateWithPrivateKey(cert, out password);
            return Task.FromResult(new AdalCredential(new ClientAssertionCertificate(aadOptions.ClientId, new X509Certificate2(certBytes, password))));
        });
    }

    public async Task<AdalCredential> GetCredentialsAsync()
    {
        return await _credential.Value;
    }
}

Surveys uygulamasını, istemci onayı ayarlama hakkında daha fazla bilgi için bkz: [uygulama parolalarını korumak için Azure anahtar kasası kullanım ] key vault.For information about setting up client assertion in the Surveys application, see Use Azure Key Vault to protect application secrets .

SonrakiNext