Session 如何在类之间共享令牌

Session 如何在类之间共享令牌,session,asp.net-web-api,stateless,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); }

我有一个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

}
公共抽象类baseApicController:ApicController,其中tenty:Entity
{
受保护的字符串GetUsername()
{
返回Utilities.GetUsername(Request.Headers.Authorization);
}
//其他代码
}
公共类StakeHolderAPI控制器:BaseAPI控制器
{
ILogger\u logger=新的CustomApiLogger(“StkhManager”,GetUsername())
//其他代码
}
现在我的问题是:

我有BaseApicController,我正在使用它,在所有ApicController之间共享某些功能

然后我为某些非共享功能指定了一些ApiController

现在,在进行日志记录时,我确实希望记录已登录的用户名,问题是每次创建新实例时我都必须传递它,是否有一种方法可以使已登录的用户名成为当前api请求的全局名称,以便可以在任何地方访问它

我不能使其静态,否则对于其他人的请求,它将给出错误的用户名

有没有一种方法可以避免每次都通过它。鉴于webapi是无状态的,所以不能使用会话,还有其他方法吗

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

注:

  • 由于某些原因,我无法将记录器的创建移动到基类

  • 这只是一个例子,我想在许多其他地方使用登录的用户名。所以我不想把它传给别人


  • 使用ASP.NET Web API设置和访问主体有一个标准模式。从
    ApiController
    中,例如您的
    BaseApiController
    ,您可以使用
    User
    属性来检索相同的内容。要设置它,通常从请求对象获取
    HttpRequestContext
    ,主体设置如下

    Request.GetRequestContext().Principal=newclaimsprincipal(…)


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

    您是否尝试过使用
    Thread.CurrentPrincipal.Identity.Name
    ?我在客户端使用angularjs,因此目前没有设置与CurrentPrincipal相关的内容。但若你们能分享我如何设置它的代码,那个就太好了……但我应该在BaseApiController中的哪里初始化Principal??或者在登录时??您应该在身份验证后设置主体。