寻找一种方法来更改http请求并在正文数据上添加用户ID

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找一种方法来更改http请求并在正文数据上添加用户ID相关的知识,希望对你有一定的参考价值。

我正在使用Web API,需要登录才能执行其他任何操作,因此我将身份与基于角色的身份验证结合使用。我想要实现的是仅在请求类型实现特定接口的情况下,才在控制器操作之前将用户ID覆盖到请求主体中。

例如,我有这些视图模型

public class UserVM : IVMLogging {
    public Guid? ID { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public bool IsActive { get; set; }
    public Guid Role { get; set; }
    public string LastModifiedBy { get; set; }
}

public class OptionVM : IVMLogging {
    public Guid? ID { get; set; }
    public string Name { get; set; }
    public string LastModifiedBy { get; set; }
}

和此界面

public interface IVMLogging {
    string LastModifiedBy { get; set; }
}

在两种情况下,我都希望在属性LastModifiedBy中存储用户ID(忽略来自客户端的值)。

这可以做到吗?

答案

虽然您可以使用中间件来修改到控制器的入站请求,但是尝试检查,序列化和反序列化主体类型的工作可能比它值得的麻烦更多。如果您想更新任何属性(例如附加用户),则控制器可以在返回时修改视图模型的内容:

    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        [HttpPost]
        public IActionResult Post(Foo foo)
        {
            foo.Qux = HttpContext.User.Identity.Name;   // Use the identity name
            foo.Qux = HttpContext.User.FindFirst("claimName").Value;    // grab a claim value
            // do whatever actions
        }
        ...

您的控制器将有权访问HTTP上下文,并且可以获取当前的标识或声明,并在处理视图模型之前将其添加到所需的位置。

如果您发现自己经常这样做,则可以为您的界面添加扩展名:

    public static class FooExtensions
    {
        public static IFoo SetFooUser(this IFoo foo, ClaimsPrincipal claimsPrincipal)
        {
            foo.Qux = claimsPrincipal.Identity.Name;
            return foo;
        }
    }

然后只要在控制器中实现接口,就可以使用foo.SetFooUser(HttpContext.User)更简单地调用它。

以上是关于寻找一种方法来更改http请求并在正文数据上添加用户ID的主要内容,如果未能解决你的问题,请参考以下文章

Azure 数据工厂 - 尝试将参数添加到 REST API 请求正文中的动态内容

在Word里,设置成标题的文字,更改正文后它的段落格式也跟着变了,为啥?谢谢

寻找一种从传入的 http 请求中获取 HTTP Digest Authentication 标头的方法

监听主进程的 HTTP 流量,处理子进程的连接?

从按钮添加照片库中的图像并在按钮上显示照片

如何将邮递员请求正文保存在一个地方并在运行时通过