【问题标题】:Add Custom properties to ClaimsPrincipal user in asp.net core 2在 asp.net core 2 中向 ClaimsPrincipal 用户添加自定义属性
【发布时间】:2018-05-13 22:26:46
【问题描述】:

根据标题的描述,我创建了一个派生自ClaimsPrincipal 的类并具有其他属性:

public class CustomeUser: ClaimsPrincipal
{
   // additional properties
}

编写了一个中间件并为其赋值:

public async Task Invoke(HttpContext context)
{
   // context to read header and assign to custome properties
   context.User = new CustomeUser() {
                         ClientIP = /*reading from claims*/,
                         UserId = /*reading from claims*/};
}

并在配置服务中添加以下行以获取 HttpContext 以从启动类中的控制器获取该自定义用户属性。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

从控制器获取客户用户属性

public BaseController(IHttpContextAccessor httpContextAccessor)
{
   customeUser = httpContextAccessor.HttpContext.User as CustomeUser;
}

这是正确的方法吗?

【问题讨论】:

    标签: asp.net-core asp.net-core-2.0 asp.net-core-webapi


    【解决方案1】:

    如果您从控制器访问HttpContext,则不需要IHttpContextAccessorMicrosoft.AspNetCore.Mvc.ControllerBase 控制器继承自的类(通过 Controller 类)具有 HttpContext 属性。因此您的代码可以更改为:

    public BaseController()
    {
       customeUser = HttpContext.User as CustomeUser;
    }
    

    其余的似乎都不错。 HttpContext.User 将包含您在 Invoke() 方法中填写的 CustomeUser 的实例,以便将讨厌的类型转换为 CustomeUser 就可以了。

    【讨论】:

    • 非常感谢您的建议,但在我运行项目后不久,我得到的 HttpContext 为空。我想我不想在这里注入 IHttpContextAccessor。任何想法 codefuller ?
    • 对这个不准确的地方感到抱歉。 HttpContext 将在 Controller 构造函数中具有 null 值,但是如果您从控制器操作中调用它,它将被填充。
    • 如果没有 BaseController 中的演员表,你会如何建议这样做?
    • 如果你想使用派生自ClaimsPrincipal 的类并避免类型转换,那么你应该有一些CustomUser 类型的字段来存储创建的用户实例。选项之一 - 使用由身份验证中间件创建的 CustomUser 对象的一些全局字典。但我会远离这种解决方案。在这种情况下,演员阵容的邪恶要少得多。
    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多