最佳实践:用户身份作为参数?

Best practice: User Identites as parameters?

我目前正在用 C# ASP.NET 开发 API。

一个端点需要调用另一个端点才能return一个值。

public class Testcontroller : BaseApiController
{
    [Authorize]
    [HttpGet]
    [Route("1", Name = "F1")]
    public async Task<IHttpActionResult> F1()
    {
        return await F2(); // calls 2nd method
    }

    [Authorize]
    [HttpGet]
    [Route("2", Name = "F2")]
    public async Task<IHttpActionResult> F2()
    {
        int I = 2;
        return Ok(I.ToString());
    }
}

好的,这整个东西的 returned 值将是 2,这绝对没问题。然而,在真实的 API 中,第二种方法需要检索有关用户的一些数据。通常用

处理
var Name = ClaimsPrincipal.Current.Identity.Name;
var CurrentUser = await this.AppUserManager.FindByNameAsync(Name);

这两行通过不记名令牌获取用户信息,通过授权过程传递给方法。

考虑到这一点,第一个函数可以调用另一个。缺点是用户数据的这两个 LOC 不起作用,因为此令牌未正确传递。

您建议如何解决此问题?我想过添加一个可选参数并通过它传递 CurrentUser。但我认为这可能会导致一些安全问题?

感谢您的帮助!

首先不要使用ClaimsPrincipal.Current。在控制器中,您有一个用户 属性,这就是身份所在。 ClaimsPrincipal.Current 是 .NET 3.5 的遗留问题。如果您打算迁移到 .NET Core,那么用户 属性 是正确的方法。

针对您的实际问题,将其传递给控制器​​外部的其他功能没有安全问题。