1

Je suis assez nouveau dans Azure AD Graph et le processus d'authentification. J'ai été en mesure d'incorporer un seul signe sur l'utilisation du client Azure AD Graph comme dans cet exemple en utilisant une application .NET MVC: https://github.com/Azure-Samples/active-directory-dotnet-graphapi-webObtenir le jeton de graphisme Azure AD si déjà authentifié

Mon dilemme est que même si j'ai authentifié ma session, il demande toujours que Je me connecte à nouveau pour effectuer les actions trouvées dans le contrôleur ci-dessous:

public ActionResult Test() 
{ 
    if (Request.QueryString["reauth"] == "True") 
    { 

     //Send an OpenID Connect sign -in request to get a new set of tokens. 
     // If the user still has a valid session with Azure AD, they will not be prompted for their credentials. 
     // The OpenID Connect middleware will return to this controller after the sign-in response has been handled. 


     HttpContext.GetOwinContext() 
      .Authentication.Challenge(OpenIdConnectAuthenticationDefaults.AuthenticationType); 
} 

// Access the Azure Active Directory Graph Client 
ActiveDirectoryClient client = AuthenticationHelper.GetActiveDirectoryClient(); 

    // Obtain the current user's AD objectId 
    string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 

    // Query and obtain the current user object from the Azure AD Graph Client 
    User user = (User)client.Users. 
     Where(u => u.ObjectId 
     .Equals(userObjectID, StringComparison.CurrentCultureIgnoreCase)). 
     ExecuteSingleAsync(). 
     Result; 

    // Get the employee Id from Azure AD (via a directory extension) 
    IReadOnlyDictionary<string, object> extendedProperty = user.GetExtendedProperties(); 
    object extendedProp = extendedProperty["extension_ExtensionId_employeeID"]; 


    // Hash the employee Id 
    var empId = PasswordHash.ArgonHashString(extendedProp.ToString(), PasswordHash.StrengthArgon.Moderate); 
    // Send to the view for testing only 
    ViewBag.EmployeeName = user.DisplayName; 
    ViewBag.EmployeeEmail = user.Mail; 
    ViewBag.EmployeeId = empId; 

    return View(); 
} 

l'erreur que je reçois est:

erreur du serveur dans «/» application autorisation requise

Avec les lignes suivantes de code dans la boîte jaune:

Line 22:    if (token == null || token.IsEmpty()) 
Line 23:    { 
Line 24:     throw new Exception("Authorization Required."); 
Line 25:    } 
Line 26:    return token; 

Depuis que je suis assez nouveau à la pièce d'authentification, je besoin d'un peu d'indications sur la façon à obtenir la session en cours jeton donc je ne suis pas cette erreur. J'utilise Azure AD Graph parce que j'obtiens une extension de répertoire spécifique dans Azure que je n'ai pas pu obtenir via Microsoft Graph (pour l'instant et en fonction de la date limite actuelle).

Tout conseil vous sera utile.

Répondre

1

Si le jeton est nul, l'utilisateur doit le réautoriser. Comme le montre code sample, vous pouvez utiliser essayer instruction catch pour gérer l'exception:

  try 
      { 

      } 
      catch (Exception e) 
      {       
       // 
       // The user needs to re-authorize. Show them a message to that effect. 
       // 
       ViewBag.ErrorMessage = "AuthorizationRequired"; 
       return View(userList); 
      } 

Afficher un message à l'utilisateur (par exemple, Index.cshtml Utilisateurs afficher le dossier):

@if (ViewBag.ErrorMessage == "AuthorizationRequired") 
{ 
    <p>You have to sign-in to see Users. Click @Html.ActionLink("here", "Index", "Users", new { reauth = true }, null) to sign-in.</p> 
} 

Si vous voulez directement envoyer une demande de connexion OpenID vous connecter pour obtenir un nouvel ensemble de jetons montrer à la place un message d'erreur à l'utilisateur, vous pouvez utiliser:

  catch (Exception e) 
      { 
       .... 

      HttpContext.GetOwinContext() 
       .Authentication.Challenge(new AuthenticationProperties {RedirectUri = "/"}, 
        OpenIdConnectAuthenticationDefaults.AuthenticationType); 
       ..... 
      } 

Si l'utilisateur a encore av alid session avec Azure AD, ils ne seront pas invités pour leurs informations d'identification. Le middleware OpenID Connect retournera au contrôleur actuel après que la réponse de connexion a été traitée.

+0

Merci pour le conseil! J'ai fini par le faire à la fin de la journée de travail et j'ai demandé aux utilisateurs de rediriger pour réautoriser l'application à nouveau. J'ai réalisé qu'il y a deux choses qui se passent - l'authentification unique authentifie l'utilisateur alors que la requête LINQ demande une autorisation spécifique à l'API de graphe Azure AD. Je l'ai interprété de manière à ce que l'authentification fournisse un accès à l'application, mais la pièce d'autorisation donne des autorisations déléguées spécifiques à une ressource spécifique. –