Utilizar a asserção de cliente para obter os tokens de acesso do Azure ADUse client assertion to get access tokens from Azure AD

Código de exemplo do GitHubGitHub Sample code

Segundo planoBackground

Ao utilizar o fluxo de código de autorização ou híbrida fluxo OpenID Connect, o cliente de troca um código de autorização para um token de acesso.When using authorization code flow or hybrid flow in OpenID Connect, the client exchanges an authorization code for an access token. Durante este passo, o cliente tem de autenticar-se ao servidor.During this step, the client has to authenticate itself to the server.

Segredo do cliente

Uma forma de autenticar o cliente é usando um segredo do cliente.One way to authenticate the client is by using a client secret. Isso como o [Tailspin Surveys] Surveys aplicação está configurada por predefinição.That's how the Tailspin Surveys application is configured by default.

Eis um exemplo de solicitação do cliente para o IDP, solicitar um token de acesso.Here is an example request from the client to the IDP, requesting an access token. Tenha em atenção o client_secret parâmetro.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...

O segredo é apenas uma cadeia de caracteres, portanto, precisa certificar-se de que não a Vazar o valor.The secret is just a string, so you have to make sure not to leak the value. A melhor prática é manter o segredo do cliente fora do controlo de origem.The best practice is to keep the client secret out of source control. Quando implementar no Azure, armazenar o segredo numa definição de aplicação.When you deploy to Azure, store the secret in an app setting.

No entanto, qualquer pessoa com acesso à subscrição do Azure pode ver as definições da aplicação.However, anyone with access to the Azure subscription can view the app settings. Além disso, há sempre uma tentação de segredos de verificação num controlo de origem (por exemplo, em scripts de implantação), partilhá-los por correio eletrónico e assim por diante.Furthermore, there is always a temptation to check secrets into source control (for example, in deployment scripts), share them by email, and so on.

Para segurança adicional, pode usar asserção de cliente em vez de um segredo do cliente.For additional security, you can use client assertion instead of a client secret. Com a asserção de cliente, o cliente utiliza um certificado X.509 para provar que o pedido de token veio do cliente.With client assertion, the client uses an X.509 certificate to prove the token request came from the client. O certificado de cliente é instalado no servidor web.The client certificate is installed on the web server. Em geral, é mais fácil de restringir o acesso ao certificado, que para se certificar de que ninguém inadvertidamente revela um segredo do cliente.Generally, it will be easier to restrict access to the certificate, than to ensure that nobody inadvertently reveals a client secret. Para obter mais informações sobre como configurar certificados numa aplicação web, consulte usando certificados em aplicativos de Web sites do AzureFor more information about configuring certificates in a web app, see Using Certificates in Azure Websites Applications

Este é um pedido de token asserção de cliente a utilizar: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...

Tenha em atenção que o client_secret parâmetro já não é utilizado.Notice that the client_secret parameter is no longer used. Em vez disso, o client_assertion parâmetro contém um token JWT que foi assinado usando o certificado de cliente.Instead, the client_assertion parameter contains a JWT token that was signed using the client certificate. O client_assertion_type parâmetro especifica o tipo de asserção — este token JWT caso,.The client_assertion_type parameter specifies the type of assertion — in this case, JWT token. O servidor valida o token JWT.The server validates the JWT token. Se o token JWT é inválido, o pedido de token devolve um erro.If the JWT token is invalid, the token request returns an error.

Nota

Certificados X.509 não são a única forma de asserção de cliente Vamos nos concentrar no mesmo aqui porque é suportado pelo Azure AD.X.509 certificates are not the only form of client assertion; we focus on it here because it is supported by Azure AD.

Tempo de execução, o aplicativo web lê o certificado do arquivo de certificados.At run time, the web application reads the certificate from the certificate store. O certificado tem de estar instalado na mesma máquina que a aplicação web.The certificate must be installed on the same machine as the web app.

A aplicação de inquéritos inclui uma classe auxiliar que cria um ClientAssertionCertificate que pode passar para o AuthenticationContext.AcquireTokenSilentAsync método para adquirir um token de O 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;
    }
}

Para obter informações sobre como configurar a asserção de cliente da aplicação de inquéritos, consulte [do Azure com o Key Vault para proteger segredos da aplicação ] key vault.For information about setting up client assertion in the Surveys application, see Use Azure Key Vault to protect application secrets .

SeguinteNext