web-dev-qa-db-fra.com

AuthenticationContext.AcquireTokenAsync nouveau en C #

Je suis nouveau sur Azure et j'aimerais pouvoir, par programme, obtenir un jeton d'Azure. Quoi que je fasse cependant, cela semble échouer - quelqu'un a-t-il un exemple concret? Merci les gars

J'appelle GetAToken().Wait();.

et la méthode est:

public async Task<string> GetAToken()
{
    // authentication parameters
    string clientID = "*********";
    string username = "<Azure login>";
    string password = "<Azure login password>";
    string directoryName = "<AD Domain name>";

    ClientCredential cc = new ClientCredential(clientID, password);
    var authenticationContext = new AuthenticationContext("https://login.windows.net/" + directoryName);

    AuthenticationResult result = await authenticationContext.AcquireTokenAsync("https://management.core.windows.net/", cc);

    if (result == null)
    {
        throw new InvalidOperationException("Failed to obtain the JWT token");
    }

    string token = result.AccessToken;

    return token;
}
3
stephen robinson

Donc, ne savez pas si vous le faites sur Android, iOS ou Xamarin.Forms. Voici comment je vais m'authentifier avec ADAL et Azure (le code fonctionne de mon côté):

Sur Android:

public async Task<AuthenticationResult> Authenticate(Activity context, string authority, string resource, string clientId, string returnUri)
{
    var authContext = new AuthenticationContext(authority);
    if (authContext.TokenCache.ReadItems().Any())
        authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);

    var uri = new Uri(returnUri);
    var platformParams = new PlatformParameters(context);
    try
    {
        var authResult = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams);
        return authResult;
    }
    catch (AdalException e)
    {
        return null;
    }
}

Sur iOS:

public async Task<AuthenticationResult> Authenticate(UIViewController controller, string authority, string resource, string clientId, string returnUri)
    {
        var authContext = new AuthenticationContext(authority);
        if (authContext.TokenCache.ReadItems().Any())
            authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);

        var controller = UIApplication.SharedApplication.KeyWindow.RootViewController;
        var uri = new Uri(returnUri);
        var platformParams = new PlatformParameters(controller);

        try
        {
            var authResult = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams);
            return authResult;
        }
        catch (AdalException e)
        {
            return null;
        }
    }

Sur UWP :

public async Task<AuthenticationResult> Authenticate(string authority, string resource, string clientId, string returnUri)
{
    var authContext = new AuthenticationContext(authority);
    if (authContext.TokenCache.ReadItems().Any())
        authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);

    var uri = new Uri(returnUri);
    var platformParams = new PlatformParameters(PromptBehavior.Auto);
    try
    {
        var authResult = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams);
        return authResult;
    }
    catch (AdalException e)
    {
        return null;
    }
}

Variable que je passe dans les méthodes ci-dessus:

string authority = "https://login.windows.net/common";
string ResourceID = "Backend ClientId";//Backend (web app)
string clientId = "Native App ClientId";//native app
string returnUri = "https://{My Azure Site}.azurewebsites.net/.auth/login/done";

Si vous voulez le faire dans Xamarin.Forms, vous trouverez ci-dessous des liens vers ma solution GitHub où j’ai exposé ces méthodes à travers la DependencyService

J'espère que ça aide! Si vous obtenez des erreurs dans votre réponse, vérifiez que vos autorisations sont correctement configurées dans Azure. Je le fais comme ça . Une autre grande ressource est Le livre Xamarin/Azure d'Adrian Hall

EDIT: Ajout de trucs UWP

7
BrewMate

SI vous utilisez les wrappers, assurez-vous d'avoir la bonne version: Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.21.301221612. Une fois référencé, vous pouvez l'exécuter ci-dessous. Pour des alternatives, voir ce blog: https://samtran.me/2018/11/11/power-bi-rest-api/

0
SamT

Si vous essayez d'appeler les API Azure comme vous le souhaitez, vous devez procéder différemment.

  1. Créez une application dans Azure AD disposant des autorisations nécessaires pour accéder à l'API Azure
    1. Si vous souhaitez appeler l'API Service Management, ajoutez-le en tant qu'autorisation
      1. Vous pouvez également utiliser un certificat de gestion.
    2. Si vous souhaitez appeler l'API Resource Management, ajoutez les autorisations nécessaires au principal du service via le nouveau portail.
  2. Si vous avez choisi la méthode déléguée pour l'API Service Management (la première option), vous devrez alors:
    1. Demander à l'utilisateur de s'authentifier auprès d'Azure AD avec le flux d'octroi de codes d'autorisation
    2. Ou obtenez le jeton d'accès à l'aide du flux d'octroi de mot de passe (vous pouvez en voir un exemple dans une autre réponse
  3. Si, à la place, vous choisissez un certificat de gestion ou accordez les autorisations au principal du service, vous pouvez obtenir le jeton d'accès directement à partir d'Azure AD à l'aide du flux d'octroi d'informations d'identification du client.

Au final, vous obtiendrez toujours un jeton d'accès que vous pourrez utiliser pour appeler l'API.

0
juunas