使用 B2C 的 Web 表单身份验证

Web Forms Authentication with B2C

我正在尝试使用 Azure AD B2C 将身份验证添加到 Web 表单 应用程序。不幸的是,我找到的每个教程都是针对 MVC 的,除了 this web forms tutorial。使用该教程,我已将此代码添加到我的 startup.auth.cs:

public partial class Startup {

    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301883
    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = "my-client-id",
                Authority = "https://login.microsoftonline.com/my-tenant"
            });
    }
}

这很好用。但是,我需要注册功能以及登录功能,但我不知道该怎么做,因为我发现的所有内容都是针对 MVC 的,而且我不确定如何将其转换为我需要的。我试过添加这样的代码:

app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(_SignUpPolicyId));
app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(_ProfilePolicyId));
app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(_SignInPolicyId));

这会在登录页面上创建另外三个按钮,但点击它们只会出现 404 错误并且没有任何额外信息,所以我也不知道该怎么做,或者即使我是朝着正确的方向前进。我以前从未使用过 B2C,所以如果有人 suggestions/has 为 Web 表单做过这类事情,我将非常感谢一些提示或示例代码。

您使用的示例正在使用 "Local Accounts"

Local Accounts 是指本地数据库,对于每个身份提供者,它都会添加一个按钮。

尝试将身份验证更改为 "No Authentication"(并自己添加所有文件)或 "Work and School Accounts"(连接到 AD,因此将其转换为 B2C)。

您将看到重定向到 https://login.microsoftonline.com/yourtenant.onmicrosoft.com/...

接下来的步骤将遵循与 MVC 示例相同的步骤,实现相同的代码段。

确保将 nuget 包更新到较新的版本(默认为 1.0 和 4.0):

<package 
    id="Microsoft.IdentityModel.Protocol.Extensions"
    version="1.0.2.206221351" 
    targetFramework="net46" />
<package 
    id="System.IdentityModel.Tokens.Jwt" 
    version="4.0.2.206221351" 
    targetFramework="net46" />

代码:

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

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(signInPolicyId));
    }

 private OpenIdConnectAuthenticationOptions CreateOptionsFromPolicy(string policy)
    {

        return new OpenIdConnectAuthenticationOptions
        {
            MetadataAddress = string.Format(aadInstance, tenant, policy),
            AuthenticationType = policy,

            ClientId = clientId,
            RedirectUri = "https://localhost:44300/",
            PostLogoutRedirectUri = redirectUri,
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
            },

            Scope = "openid",
            ResponseType = "id_token",

            TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = "name",
            },
        };
    }

添加一个 /Account/SignIn.aspx 页面,并在后面的代码中放置来自 MVC 示例登录的代码:

 if (!Request.IsAuthenticated)
        {                
            // To execute a policy, you simply need to trigger an OWIN challenge.
            // You can indicate which policy to use by adding it to the AuthenticationProperties using the
            // PolicyKey provided.
            HttpContext.Current.GetOwinContext().Authentication.Challenge(
                new AuthenticationProperties()
                {
                    RedirectUri = "/",
                },
                appConfiguration.B2CSignInPolicyId);
        }