我正在尝试获取基本控制器中的当前登录用户
public abstract class BaseController : ControllerBase
{
private readonly UserManager<ApplicationUser> _userManager;
public BaseController()
{
var user = _userManager.FindByNameAsync(User.Identity.Name).Result;
}
}
但是,用户为null,因此User.Identity.Name
被创建为null指针异常。
我使用的是visual studio的Asp.net核心3.1和Angular模板,身份服务器作为
<PackageReference Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Version="3.1.8" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.8" />
启动.cs
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>()
.AddProfileService<ProfileService>();
services.AddAuthentication()
.AddIdentityServerJwt();
app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
配置文件服务
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var user = await _userManager.GetUserAsync(context.Subject);
var claims = new List<Claim>
{
new Claim("FullName", $"{user.FirstName} {user.LastName}" ),
new Claim("Email", user.Email ),
new Claim("UserId", user.Id),
new Claim("name", user.Email),
};
context.IssuedClaims.AddRange(claims);
}
您需要首先检查用户。标识不为null。对于未经身份验证的用户,它将为null。
您应该考虑到防御,因为您可能会在没有nor或无效会话cookie的情况下向任何端点发送请求。所以你应该对这个用例进行编程和保护。
如果用户为null,您也可以询问该用户并将其重定向到您的IdentityServer。
例如,您可以检查httpcontext.request对象,看看触发null异常的请求是否包含任何cookie?
HttpContext在构造函数中被调用,然后还没有实例化HttpContext,因为当客户端连接到此控制器时会发生这种情况。因此,将代码移动到方法,工作
public abstract class BaseController : ControllerBase
{
private readonly UserManager<ApplicationUser> _userManager;
public BaseController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
protected async Task<(string , string, string)> GetUser()
{
var email = User.Identity.Name;
var user = await _userManager.FindByEmailAsync(email);
return (user.Id , $"{user.FirstName} {user.LastName}", user.Email);
}
}