0

Je développe actuellement une application utilisant AD-B2C comme fournisseur d'identité. Ceci est intégré dans la solution en utilisant leurs directives au AD B2C graph, qui utilise openid-connect (au mieux de ma compréhension au moins). Je dois utiliser une forme d'activation d'email (en dehors de leur politique d'enregistrement) et en tant que tel, je dois être en mesure de transmettre une valeur de l'URL dans l'e-mail, à travers le processus d'inscription au B2C et retour à l'URL de redirectionComment envoyer une valeur via AD-B2C en utilisant openid-Connect

J'ai lu quelque part qu'un paramètre appelé « état » peut être utilisé pour cela:

État: une valeur comprise dans la demande qui sera également renvoyé dans la réponse symbolique. Cela peut être une chaîne de n'importe quel contenu que vous voulez. Une valeur unique générée aléatoirement est généralement utilisée pour empêcher les attaques de falsification de requêtes intersites. L'état est également utilisé pour coder les informations sur l'état de l'utilisateur dans l'application avant que la demande d'authentification ne se soit produite, telle que la page sur laquelle elles se trouvaient ou la stratégie en cours d'exécution.

J'ai essayé d'ajouter une valeur à la redirection qui se produit lors du transfert de l'utilisateur vers le B2C, mais je ne sais pas comment.

if (!Request.IsAuthenticated) 
     { // go to login page 
      HttpContext.GetOwinContext().Authentication.Challenge(
        new AuthenticationProperties() { RedirectUri = "/" }, Startup.SignUpSignInPolicyId); 
     } 

La politique est stockée dans le fichier startup.auth.cs ...

// B2C policy identifiers 
    public static string SignUpPolicyId = ConfigurationManager.AppSettings["ida:SignUpPolicyId"]; 
    public static string SignInPolicyId = ConfigurationManager.AppSettings["ida:SignInPolicyId"]; 
    public static string SignUpSignInPolicyId = ConfigurationManager.AppSettings["ida:SignUpSignInPolicyId"]; 
    public static string ProfilePolicyId = ConfigurationManager.AppSettings["ida:UserProfilePolicyId"]; 
    public static string PasswordResetPolicyId = ConfigurationManager.AppSettings["ida:PasswordResetPolicyId"]; 

.... et est géré au cours de la méthode ConfigureAuth:

public void ConfigureAuth(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions() 
     { 
      CookieHttpOnly = true, 
      ExpireTimeSpan = TimeSpan.FromHours(1), 
     }); 

     // Configure OpenID Connect middleware for each policy 
     app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(SignUpPolicyId)); 
     app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(ProfilePolicyId)); 
     app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(SignInPolicyId)); 
     app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(SignUpSignInPolicyId)); 
     app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(PasswordResetPolicyId)); 
    } 

qui appelle:

private OpenIdConnectAuthenticationOptions CreateOptionsFromPolicy(string policy) 
    { 
     return new OpenIdConnectAuthenticationOptions 
     { 
      // For each policy, give OWIN the policy-specific metadata address, and 
      // set the authentication type to the id of the policy 
      MetadataAddress = String.Format(aadInstance, tenant, policy), 
      AuthenticationType = policy, 

      // These are standard OpenID Connect parameters, with values pulled from web.config 
      ClientId = clientId, 
      RedirectUri = redirectUri, 
      PostLogoutRedirectUri = redirectUri, 
      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       AuthenticationFailed = AuthenticationFailed, 
      }, 
      Scope = "openid", 
      ResponseType = "id_token", 
      //// This piece is optional - it is used for displaying the user's name in the navigation bar. 
      //TokenValidationParameters = new TokenValidationParameters 
      //{ 
      // NameClaimType = "name", 
      //}, 
     }; 

    } 

Comment puis-je passer une valeur comme: (exemple simplifié :)

if (!Request.IsAuthenticated) 
     { // go to login page 
      HttpContext.GetOwinContext().Authentication.Challenge(
        new AuthenticationProperties() { RedirectUri = "/" }, Startup.SignUpSignInPolicyId, new { state = "value=uniquetoken&token=secrets" }); 
     } 

Lorsque ces méthodes et politiques sont définies sur l'exécution? De plus, si je me dirige dans une mauvaise direction, où dois-je aller?

Toute aide est appréciée :)

Cordialement

Répondre

0

Pour passer une valeur lorsque nous utilisons le protocole OpenID Connect, nous pouvons ajouter de la valeur à l'état que vous avez mentionné.

Nous pouvons transmettre cette valeur avant de la rediriger vers le fournisseur de données d'identité (Azure AD) à l'aide de RedirectToIdentityProvider. Après cela, nous pouvons extraire les valeurs personnalisées que nous avons ajoutées en utilisant le MessageReceived lorsqu'un message de protocole est reçu pour la première fois.

Voici l'exemple de code pour votre référence:

new OpenIdConnectAuthenticationOptions 
{ 
    // For each policy, give OWIN the policy-specific metadata address, and 
    // set the authentication type to the id of the policy 
    MetadataAddress = String.Format(aadInstance, tenant, policy), 
    AuthenticationType = policy, 

    // These are standard OpenID Connect parameters, with values pulled from web.config 
    ClientId = clientId, 
    RedirectUri = redirectUri, 
    PostLogoutRedirectUri = redirectUri, 
    Notifications = new OpenIdConnectAuthenticationNotifications 
    { 
     AuthenticationFailed = AuthenticationFailed, 
     RedirectToIdentityProvider= OnRedirectToIdentityProvider, 
     MessageReceived= OnMessageReceived 
    }, 
    Scope = "openid", 
    ResponseType = "id_token", 

    // This piece is optional - it is used for displaying the user's name in the navigation bar. 
    TokenValidationParameters = new TokenValidationParameters 
    { 
     NameClaimType = "name", 
    }, 
}; 

private Task OnRedirectToIdentityProvider(RedirectToIdentityProviderNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification) 
{ 
    var stateQueryString = notification.ProtocolMessage.State.Split('='); 
    var protectedState = stateQueryString[1]; 
    var state = notification.Options.StateDataFormat.Unprotect(protectedState); 
    state.Dictionary.Add("mycustomparameter", "myvalue"); 
    notification.ProtocolMessage.State = stateQueryString[0] + "=" + notification.Options.StateDataFormat.Protect(state); 
    return Task.FromResult(0); 
} 

private Task OnMessageReceived(MessageReceivedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification) 
{ 
    string mycustomparameter; 
    var protectedState = notification.ProtocolMessage.State.Split('=')[1]; 
    var state = notification.Options.StateDataFormat.Unprotect(protectedState); 
    state.Dictionary.TryGetValue("mycustomparameter", out mycustomparameter); 
    return Task.FromResult(0); 
} 
+0

Merci pour votre réponse Fei. J'ai deux questions de suivi. Tout d'abord, je n'arrive pas à maintenir l'état entre OnRedirectToIdentityProvider et OnMessageReceived. À l'intérieur de OnMessageReceived. L'état s'avère nul. En outre, je suis confus quant à la façon dont je définirais le "mycustomparameter" de l'extérieur de la classe startup.auth.cs. Pouvez-vous me donner un exemple de la façon dont vous définissez/injectez la valeur à partir de IE. un contrôleur? – HAMY0707

+0

J'ai réduit le premier problème à la méthode protect, unprotect (StateDataFormat). Unprotect ne semble pas fonctionner dans "OnMessageReceived" - mais cela fonctionne très bien dans "OnRedirectToIdentityProvider". Peut-être parce que le jeton utilisé pour protéger est perdu sur la nouvelle requête? Je n'ai fait aucun progrès dans la deuxième question. – HAMY0707

+0

Dans le contrôleur, juste avant d'appeler Challenge(), vous devez définir votre "mycustomparameter" dans le contexte et le récupérer dans le OnRedirectToIdentityProvider pour le mettre dans l'état. – Saca