将内部身份验证与B2C身份验证相结合的同一Azure Web应用程序的正确方法是什么?

时间:2017-01-31 00:29:07

标签: azure-active-directory

我有一个使用AAD进行身份验证的应用程序Web MVC,但我需要使用相同的应用程序作为B2C。

有没有办法配置它,或者我应该创建一个页面供用户选择通过哪个目录进行身份验证。

1 个答案:

答案 0 :(得分:0)

  

有没有办法配置它,或者我应该创建一个页面供用户选择通过哪个目录进行身份验证。

根据我的理解,如果Web应用程序提供多个身份数据提供程序,我们需要提供一种方法来为用户提供他们想要身份验证的身份数据提供程序。例如,我们可以提供两个按钮或自定义登录页面,如上所述。

这是一段自定义代码,用户可以使用代码示例here中的两个按钮选择登录方式。

_LoginPartial.cshtml(添加UI以选择身份数据提供者):

<ul class="nav navbar-nav navbar-right">
    <li>@Html.ActionLink("Sign up", "SignUp", "Account", routeValues: null, htmlAttributes: new { id = "signUpLink" })</li>
    <li>@Html.ActionLink("Sign in", "SignIn", "Account", routeValues: new { b2c=false}, htmlAttributes: new { id = "loginLink" })</li>
    <li>@Html.ActionLink("Sign in B2C", "SignIn", "Account", routeValues: new { b2c = true }, htmlAttributes: new { id = "loginLink" })</li>
</ul>

Startup.Auth.cs(提供者两个身份数据提供者)

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

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

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

        //config for normal azure ad
        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = "{AzureADClientId}",
                Authority = "https://login.microsoftonline.com/xxx.onmicrosoft.com",
                PostLogoutRedirectUri = redirectUri,
                RedirectUri = redirectUri,
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthenticationFailed = context =>
                    {
                        context.HandleResponse();
                        context.Response.Redirect("/Error?message=" + context.Exception.Message);
                        return Task.FromResult(0);
                    }

                }
            });
  }

AccountController.cs(根据用户的选择重定向到身份数据提供者)

public void SignIn(bool b2c)
{
        if (!Request.IsAuthenticated)
        {
            if (b2c)
            {
                // To execute a policy, you simply need to trigger an OWIN challenge.
                // You can indicate which policy to use by specifying the policy id as the AuthenticationType
                HttpContext.GetOwinContext().Authentication.Challenge(
                    new AuthenticationProperties() { RedirectUri = "/" }, Startup.SignInPolicyId);
            }
            else
                HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);
        }
}

希望它有所帮助。