C# 如何为多租户Azure AD请求设置域提示?

C# 如何为多租户Azure AD请求设置域提示?,c#,azure-active-directory,C#,Azure Active Directory,当使用OpenID Connect使用Azure AD进行身份验证时,可以在身份验证请求中包含域提示参数,以将用户重定向到其品牌Azure登录页面(类似于使用whr——例如,请参阅和之间的区别) 如果为单个租户提供服务,则可以很容易地使用以下内容进行设置: app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = clientId,

当使用OpenID Connect使用Azure AD进行身份验证时,可以在身份验证请求中包含
域提示
参数,以将用户重定向到其品牌Azure登录页面(类似于使用
whr
——例如,请参阅和之间的区别)

如果为单个租户提供服务,则可以很容易地使用以下内容进行设置:

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
方法属性或类似属性的一部分传递给用户?

当然!有关将应用程序中的上下文传递到登录消息生成管道的方法,请参阅。您可以很容易地调整示例(表示二进制同意选项)以指定域提示、登录提示或您需要的任何组合。

在我问了这个问题后不久,我开始采用与@vibronet发布的答案类似的方法,对于在这里发布解决方案后出现的人来说也是如此

上面对
Challenge()
的调用中的
properties
对象(类型为
AuthenticationProperties
)的一部分是一个
Dictionary
对象,名为
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);
            }
        }
    }
);
希望这有帮助