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
相关产品推荐
相关产品推荐

