最佳实践:用户身份作为参数?
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,那么用户 属性 是正确的方法。
针对您的实际问题,将其传递给控制器外部的其他功能没有安全问题。
我目前正在用 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,那么用户 属性 是正确的方法。
针对您的实际问题,将其传递给控制器外部的其他功能没有安全问题。