寻找一种方法来更改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里,设置成标题的文字,更改正文后它的段落格式也跟着变了,为啥?谢谢