You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET Framework 4.6.2中集成Azure B2C身份验证

.NET Framework 4.6.2 集成 Azure AD B2C 身份验证指南

一、前置准备

  • 已创建Azure AD B2C租户,配置好用户流(推荐SignUpSignIn基础流)
  • 在B2C租户中注册应用程序,记录以下信息:
    • 租户ID(格式:your-tenant-name.onmicrosoft.com)
    • 客户端ID(应用的唯一标识符)
    • 重定向URI(需与代码中配置一致,示例:https://localhost:44300/signin-oidc)
  • 确保项目已升级至.NET Framework 4.6.2,安装必要NuGet包:
    Install-Package Microsoft.Owin.Security.OpenIdConnect
    Install-Package Microsoft.Owin.Security.Cookies
    Install-Package Microsoft.Owin.Host.SystemWeb
    

二、核心配置(OWIN Startup类)

在项目中添加Startup.cs类,配置OWIN中间件实现B2C认证:

using Microsoft.Owin;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;
using Owin;
using System.Configuration;
using System.Threading.Tasks;

[assembly: OwinStartup(typeof(YourProjectNamespace.Startup))]
namespace YourProjectNamespace
{
    public class Startup
    {
        // 从配置文件读取B2C参数
        private static readonly string TenantId = ConfigurationManager.AppSettings["AzureAdB2C:TenantId"];
        private static readonly string ClientId = ConfigurationManager.AppSettings["AzureAdB2C:ClientId"];
        private static readonly string SignUpSignInPolicy = ConfigurationManager.AppSettings["AzureAdB2C:SignUpSignInPolicyId"];
        private static readonly string RedirectUri = ConfigurationManager.AppSettings["AzureAdB2C:RedirectUri"];

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

            // 配置Cookie认证
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                CookieHttpOnly = true,
                ExpireTimeSpan = TimeSpan.FromHours(1),
                SlidingExpiration = true
            });

            // 配置OpenID Connect集成B2C
            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                ClientId = ClientId,
                Authority = $"https://{TenantId}.b2clogin.com/{TenantId}.onmicrosoft.com/{SignUpSignInPolicy}/v2.0/",
                RedirectUri = RedirectUri,
                PostLogoutRedirectUri = RedirectUri,
                ResponseType = "id_token",
                Scope = "openid profile",
                TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
                {
                    NameClaimType = "name",
                    ValidateIssuer = true
                },
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthenticationFailed = context =>
                    {
                        // 处理认证失败逻辑,比如跳转至错误页
                        context.HandleResponse();
                        context.Response.Redirect("/Error?message=" + context.Exception.Message);
                        return Task.FromResult(0);
                    }
                }
            });
        }
    }
}

三、Web.config 配置项

在Web.config的<appSettings>中添加B2C参数:

<appSettings>
  <add key="AzureAdB2C:TenantId" value="your-tenant-name.onmicrosoft.com" />
  <add key="AzureAdB2C:ClientId" value="your-client-id-guid" />
  <add key="AzureAdB2C:SignUpSignInPolicyId" value="B2C_1_SignUpSignIn" />
  <add key="AzureAdB2C:RedirectUri" value="https://localhost:44300/signin-oidc" />
</appSettings>

四、登录/登出按钮代码示例

1. ASP.NET Web Forms 示例

在ASPX页面添加按钮:

<asp:Button ID="btnLogin" runat="server" Text="登录" OnClick="btnLogin_Click" />
<asp:Button ID="btnLogout" runat="server" Text="登出" OnClick="btnLogout_Click" Visible="false" />
<asp:Label ID="lblUserName" runat="server" Visible="false"></asp:Label>

后台逻辑代码:

using System.Web;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.OpenIdConnect;

protected void Page_Load(object sender, EventArgs e)
{
    // 检查用户认证状态
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        btnLogin.Visible = false;
        btnLogout.Visible = true;
        lblUserName.Visible = true;
        lblUserName.Text = $"当前用户:{HttpContext.Current.User.Identity.Name}";
    }
}

protected void btnLogin_Click(object sender, EventArgs e)
{
    // 触发B2C认证流程
    HttpContext.Current.GetOwinContext().Authentication.Challenge(
        new AuthenticationProperties { RedirectUri = "/" },
        OpenIdConnectAuthenticationDefaults.AuthenticationType);
}

protected void btnLogout_Click(object sender, EventArgs e)
{
    // 登出并清除认证Cookie
    HttpContext.Current.GetOwinContext().Authentication.SignOut(
        CookieAuthenticationDefaults.AuthenticationType,
        OpenIdConnectAuthenticationDefaults.AuthenticationType);
}

2. ASP.NET MVC 示例

Controller中添加登录/登出Action:

using System.Web;
using System.Web.Mvc;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.OpenIdConnect;

public class AccountController : Controller
{
    public void Login()
    {
        if (!Request.IsAuthenticated)
        {
            HttpContext.GetOwinContext().Authentication.Challenge(
                new AuthenticationProperties { RedirectUri = "/" },
                OpenIdConnectAuthenticationDefaults.AuthenticationType);
        }
    }

    public void Logout()
    {
        HttpContext.GetOwinContext().Authentication.SignOut(
            CookieAuthenticationDefaults.AuthenticationType,
            OpenIdConnectAuthenticationDefaults.AuthenticationType);
    }
}

View中添加按钮:

@if (Request.IsAuthenticated)
{
    <p>当前用户:@User.Identity.Name</p>
    @Html.ActionLink("登出", "Logout", "Account")
}
else
{
    @Html.ActionLink("登录", "Login", "Account")
}

五、最佳实践

  • 强制HTTPS:生产环境必须使用HTTPS,避免令牌泄露
  • 缓存元数据:可配置OpenID Connect中间件缓存B2C的元数据,减少重复请求
  • 令牌过期处理:通过Cookie的SlidingExpiration属性实现会话续期,或监听令牌过期事件发起重新认证
  • 权限控制:使用[Authorize]特性保护需要认证的页面/Action,结合B2C角色声明实现细粒度权限
  • 日志记录:在AuthenticationFailed等通知事件中记录详细日志,便于排查认证问题
  • 全流程测试:提前测试注册、登录、密码重置等完整用户流程,确保B2C配置与代码逻辑匹配

内容的提问来源于stack exchange,提问作者ice_hell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:43:21