【发布时间】:2020-11-23 01:18:48
【问题描述】:
在 .Net core 3.1 中构建 API。我正在使用我在网上某处找到的 JWT 身份验证设置。效果很好,但是对于如何从控制器中获取有关经过身份验证的用户的信息,以便检查执行某些操作的权限,我感到有些困惑。
在 Startup.cs 的 ConfigureServices 方法中,我有以下代码。我需要从控制器中访问由 userService 生成的“用户”变量(或 userId 变量)。或者,当然是 context.Principal.Identity.Name 值。
// configure strongly typed settings objects
var appSettingsSection = Configuration.GetSection("AppSettings");
services.Configure<AppSettings>(appSettingsSection);
// configure jwt authentication
var appSettings = appSettingsSection.Get<AppSettings>();
var key = Encoding.ASCII.GetBytes(appSettings.Secret);
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
var userId = int.Parse(context.Principal.Identity.Name);
var user = userService.GetById(userId);
if (user == null)
{
// return unauthorized if user no longer exists
context.Fail("Unauthorized");
}
return Task.CompletedTask;
}
};
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
【问题讨论】:
-
您可以通过
User属性从控制器内访问用户主体。显示一个示例,说明您尝试在控制器中执行的操作。
标签: api jwt asp.net-core-3.1