Comment autoriser dans Azure Active Directory sans utiliser de dialogue ?
Mon application affiche le tableau de bord de mon compte power bi pour tous les utilisateurs, j'autorise Azure Active Directory via une boîte de dialogue pour obtenir un jeton d'accès. Puis-je coder en dur mes informations d'identification et obtenir un jeton d'accès sans utiliser la boîte de dialogue d'autorisation. Code. Cela fonctionne mais il utilise la boîte de dialogue d'autorisation.
var @params = new NameValueCollection
{
{"response_type", "code"},
{"client_id", Properties.Settings.Default.ClientID},
{"resource", "https://analysis.windows.net/powerbi/api"},
{"redirect_uri", "http://localhost:13526/Redirect"}
};
var queryString = HttpUtility.ParseQueryString(string.Empty);
queryString.Add(@params);
string authorityUri = "https://login.windows.net/common/oauth2/authorize/";
var authUri = String.Format("{0}?{1}", authorityUri, queryString);
Response.Redirect(authUri);
Redirect.aspx
string redirectUri = "http://localhost:13526/Redirect";
string authorityUri = "https://login.windows.net/common/oauth2/authorize/";
string code = Request.Params.GetValues(0)[0];
TokenCache TC = new TokenCache();
AuthenticationContext AC = new AuthenticationContext(authorityUri, TC);
ClientCredential cc = new ClientCredential
(Properties.Settings.Default.ClientID,
Properties.Settings.Default.ClientSecret);
AuthenticationResult AR = AC.AcquireTokenByAuthorizationCode(code, new Uri(redirectUri), cc);
Session[_Default.authResultString] = AR;
Response.Redirect("/Default.aspx");
Default.aspx
string responseContent = string.Empty;
System.Net.WebRequest request = System.Net.WebRequest.Create(String.Format("{0}dashboards", baseUri)) as System.Net.HttpWebRequest;
request.Method = "GET";
request.ContentLength = 0;
request.Headers.Add("Authorization", String.Format("Bearer {0}", authResult.AccessToken));
using (var response = request.GetResponse() as System.Net.HttpWebResponse)
{
using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
{
responseContent = reader.ReadToEnd();
PBIDashboards PBIDashboards = JsonConvert.DeserializeObject<PBIDashboards>(responseContent);
}
}
Solution du problème
Je l'ai fait une fois sans utiliser ADAL. Pour Power BI également, puisqu'ils n'offrent pas d'autorisations d'application, uniquement déléguées.
Remarque : Cette méthode ne fonctionnera pas si l'authentification MFA est activée pour l'utilisateur, si son mot de passe a expiré, etc. En général, vous souhaiterez utiliser des flux interactifs. Vous pouvez même avoir un processus d'amorçage où l'utilisateur se connecte de manière interactive et vous stockez le jeton d'actualisation reçu. Ce jeton d'actualisation peut ensuite être utilisé en arrière-plan tant qu'il fonctionne.
Ce dont vous avez besoin, c'est d'appeler le point de terminaison du jeton AAD avec grant_type=password
. Vous spécifierez le nom d'utilisateur et le mot de passe, ainsi que l'ID client, le secret client et l'URI de la ressource dans les paramètres du formulaire.
Voici la fonction que j'ai écrite:
private async Task<string> GetAccessToken()
{
string tokenEndpointUri = Authority + "oauth2/token";
var content = new FormUrlEncodedContent(new []
{
new KeyValuePair<string, string>("grant_type", "password"),
new KeyValuePair<string, string>("username", Username),
new KeyValuePair<string, string>("password", Password),
new KeyValuePair<string, string>("client_id", ClientId),
new KeyValuePair<string, string>("client_secret", ClientSecret),
new KeyValuePair<string, string>("resource", PowerBiResourceUri)
}
);
using (var client = new HttpClient())
{
HttpResponseMessage res = await client.PostAsync(tokenEndpointUri, content);
string json = await res.Content.ReadAsStringAsync();
AzureAdTokenResponse tokenRes = JsonConvert.DeserializeObject<AzureAdTokenResponse>(json);
return tokenRes.AccessToken;
}
}
L'autorité est ici https://login.microsoftonline.com/tenant-id/
. Voici la classe de réponse que j'utilise :
class AzureAdTokenResponse
{
[JsonProperty("access_token")]
public string AccessToken { get; set; }
}
Commentaires
Enregistrer un commentaire