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

时间:2016-04-07 16:01:01

标签: c# asp.net identity

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

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

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());
    }
}

好的,整件事的返回值为2,这绝对没问题。但是,在真实的API中,第二种方法需要检索有关用户的一些数据。通常用

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

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

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

您如何建议解决此问题?我考虑添加一个可选参数并通过它传递CurrentUser。但我认为这可能会在安全方面造成一些问题?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

在回答您的实际问题时,将其传递给控制器​​以外的其他功能没有任何安全问题。