如何在类之间共享令牌

时间:2014-11-12 09:39:59

标签: session asp.net-web-api stateless

我有一个asp.net web-api的设计问题,想知道如何解决这个问题

public abstract class BaseApiController<TEntity> : ApiController where TEntity : Entity
{

    protected string GetUsername()
    {
        return Utilities.GetUsername(Request.Headers.Authorization);
    }

     //some other code

 }

public class StakeholderApiController : BaseApiController<Stakeholders>
{
      ILogger _logger = new CustomApiLogger("StkhManager", GetUsername())

     //some other code

}

现在我遇到的问题是:

我有BaseApiController,我使用它在所有ApiControllers之间共享某些功能。

然后我有一些指定的ApiController用于某些不共享的功能。

现在在进行日志记录时,我确实要记录登录用户的名称,问题是我每次创建新实例时都必须通过它,有没有办法让我登录用户&# 39; s为当前api请求命名为global,以便可以在任何地方访问它。

我无法将其设为静态,否则对于其他人请求它会给出错误的用户名。

有没有办法可以避免每次传递它。鉴于webapi是无状态的,因此无法使用会话,还有其他方法吗?

我正在使用angularjs前端,因此我没有使用MVC / .net提供的任何授权技术

注意:

  1. 由于某些原因,我无法将Logger的创建移动到基类

  2. 这只是一个例子,我想在许多其他地方使用登录用户的名字。因此,不想传递它。

1 个答案:

答案 0 :(得分:1)

使用ASP.NET Web API设置和访问主体时有一个标准模式。从您ApiController之类的BaseApiController,您可以使用User属性来检索相同内容。要进行设置,通常会从请求对象中获取HttpRequestContext,并且这样设置主体。

Request.GetRequestContext().Principal = new ClaimsPrincipal(...);

顺便说一句,您可以从任何地方访问Web API管道中的当前请求对象。