【问题标题】:Access services information from within controller of .Net Core 3.1 API从 .Net Core 3.1 API 的控制器内访问服务信息
【发布时间】: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


【解决方案1】:

一旦请求通过身份验证,就可以通过ControllerBase.User 属性在控制器内访问用户主体

获取与执行操作关联的用户的 ClaimsPrincipal。

public System.Security.Claims.ClaimsPrincipal User { get; }

所以假设IUserService被注入到控制器中,则可以通过控制器访问主体并根据需要使用。

public IActionResult SomeAction() {
    var userId = int.Parse(User.Identity.Name);
    var user = userService.GetById(userId);
    
    //...

}

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多