2017-07-31 52 views
1

当使用Azure AD进行使用OpenID Connect的身份验证时,可以在身份验证请求中包含domain_hint参数,以将用户重定向到其品牌化的Azure登录页面(类似于使用whr - 请参阅http://login.microsoftonline.com/http://login.microsoftonline.com?whr=microsoft.com之间的差异,例如)。如何为多租户Azure AD请求设置域提示?

如果单个租户提供服务,这是很容易设置此使用类似:

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions 
    { 
     ClientId = clientId, 
     Authority = authority, 
     PostLogoutRedirectUri = postLogoutRedirectUri, 
     Notifications = new OpenIdConnectAuthenticationNotifications() 
     { 
      RedirectToIdentityProvider = (context) => 
      {               
       context.ProtocolMessage.DomainHint = "mydomain.com"; 
       return Task.FromResult(0); 
      }, 
     } 
    }) 

不过,我上询问用户的电子邮件多租户应用程序的工作,并然后根据配置设置,将允许用户使用本地密码登录,或将其重定向到Azure以进行身份​​验证。这是通过调用影响到:

context.HttpContext.GetOwinContext().Authentication.Challenge(properties, "AzureAd"); 

因为我不知道在应用程序启动的DomainHint(它会根据用户的组织变革),是有办法通过DomainHint参数作为部分Challenge方法的属性或类似?

回答

1

不久之后,我问了这个问题,我开始下了类似的路径到@vibronet发布的答案,以及那些在解决方案发布之后来到这里的人。上述properties对象在调用Challenge()(类型AuthenticationProperties的)的

部分是一个Dictionary<string, string>对象,称为Dictionary(如幸运的是)。在Challenge()呼叫之前,域提示在此设置:

properties.Dictionary["DomainHint"] = domainHint; 

由于@vibronet建议,则有可能通过改变在启动的app.UserOpenIdConnectAuthentication()调用访问管道。此调用现在看起来像:

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions 
    { 
     ... 
     Notifications = new OpenIdConnectAuthenticationNotifications 
     { 
      ... 
      RedirectToIdentityProvider = notification => 
      { 
       var dict = notification.OwinContext.Authentication.AuthenticationResponseChallenge.Properties.Dictionary; 
       if (dict.ContainsKey("DomainHint")) 
       { 
        notification.ProtocolMessage.DomainHint = dict["DomainHint"]; 
       } 

       return Task.FromResult(0); 
      } 
     } 
    } 
); 

希望这会有所帮助。