ASP.NET Identity自定义Claims存储后Controller.User无声明问题求助
问题原因
你在PasswordSignInAsync执行成功后立即查看当前控制器的User属性为空,是ASP.NET Core身份验证体系的正常表现:
控制器的User属性是请求进入管道时,由身份验证中间件从本次请求携带的Cookie解析生成的,在请求到达控制器前就已经完成初始化。PasswordSignInAsync执行成功仅会将身份验证Cookie写入本次请求的响应头,不会修改本次请求已经生成的User对象。你重定向后浏览器携带新Cookie发起下一次请求时,User属性就会正常包含所有声明。
额外配置修正建议
为了避免后续运行异常,建议补充以下调整:
- 修正中间件管道顺序
确保Program.cs/Startup.cs里的中间件顺序符合要求,UseAuthentication必须放在UseAuthorization之前,否则后续请求就算携带Cookie也不会被解析:
app.UseRouting(); // 顺序不能乱 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { /* 路由配置 */ });
- 实现缺失的IUserStore方法
你当前的CustomUserStore中GetNormalizedUserNameAsync直接抛出未实现异常,虽然现在登录流程没触发该方法,但Identity内部很多逻辑依赖用户名规范化逻辑,建议补充实现:
public Task<string> GetNormalizedUserNameAsync(User user, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); return Task.FromResult(user.Username?.ToUpperInvariant()); }
- 本次请求获取身份信息的方案
如果你需要在登录成功的本次请求里就拿到包含自定义声明的身份对象,可以手动调用SignInManager的CreateUserPrincipalAsync方法:
if (result.Succeeded) { var principal = await mSignInManager.CreateUserPrincipalAsync(user); // principal 已经包含所有自定义声明,可以直接在当前请求逻辑中使用 }
内容的提问来源于stack exchange,提问作者inthegarden
相关产品推荐
相关产品推荐

