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

ASP.NET Core 2 Web应用中Thread.CurrentPrincipal返回null的问题咨询

解决ASP.NET Core 2中Thread.CurrentPrincipal返回null的问题

兄弟,你踩了ASP.NET Core和传统.NET Framework在身份认证上的典型坑——ASP.NET Core已经完全抛弃了Thread.CurrentPrincipal这种线程绑定的身份跟踪方式,转而使用和请求生命周期绑定的HttpContext.User,这和你之前用Azure Functions的环境逻辑完全不同。下面给你一步步的解决方法和配置建议:

一、修改Razor页面的OnGet方法

直接把你的代码改成ASP.NET Core标准写法,用框架内置的User属性获取当前用户:

public void OnGet()
{
    // 直接使用框架注入的User属性,对应当前请求的认证用户
    var isAuth = User.Identity.IsAuthenticated;
    ClaimsPrincipal cp = User;
}

为什么这么改?

  • Razor页面的代码-behind类(比如IndexModel)会自动继承PageModel,而PageModel已经封装了User属性,直接对应HttpContext.User,不需要手动从线程里取。
  • ASP.NET Core的请求上下文是和请求绑定的,不是线程绑定,用Thread.CurrentPrincipal会因为线程池复用等问题导致身份丢失或错误。

二、ConfigureServices中的Azure AD B2C配置建议

要让User属性正常获取到Azure AD B2C的认证信息,你需要正确配置认证服务,以下是ASP.NET Core 2中的典型配置示例:

1. 基础认证服务配置

using Microsoft.AspNetCore.Authentication.AzureADB2C.UI;

public void ConfigureServices(IServiceCollection services)
{
    // 添加Razor页面支持
    services.AddRazorPages();

    // 配置Azure AD B2C认证
    services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
        .AddAzureADB2C(options => Configuration.Bind("AzureADB2C", options));

    // 可选:设置全局默认授权策略,强制用户登录才能访问页面
    services.AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
    });
}

2. 启用认证中间件(关键!)

在Configure方法中,必须把认证和授权中间件放在路由中间件之前,顺序不能错:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    // 先启用认证中间件,处理用户身份
    app.UseAuthentication();
    // 再启用授权中间件,校验访问权限
    app.UseAuthorization();

    // 配置Razor页面路由
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

3. appsettings.json配置参数

你的配置文件里需要添加Azure AD B2C的核心参数,示例如下:

{
  "AzureADB2C": {
    "Instance": "https://你的租户名.b2clogin.com/",
    "ClientId": "你的应用注册客户端ID",
    "Domain": "你的租户名.onmicrosoft.com",
    "SignUpSignInPolicyId": "B2C_1_你的注册登录策略名",
    "CallbackPath": "/signin-oidc"
  }
}

三、额外优化建议

如果你的页面需要强制用户登录,直接在IndexModel上添加[Authorize]特性即可,未认证用户会自动跳转到Azure AD B2C的登录页面:

[Authorize]
public class IndexModel : PageModel
{
    public void OnGet()
    {
        var isAuth = User.Identity.IsAuthenticated;
        ClaimsPrincipal cp = User;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:44:26