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;
}
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
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/
Si vous essayez d'appeler les API Azure comme vous le souhaitez, vous devez procéder différemment.
Au final, vous obtiendrez toujours un jeton d'accès que vous pourrez utiliser pour appeler l'API.