Session 如何在类之间共享令牌
我有一个asp.net web api的设计问题,想知道如何解决这个问题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); }
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??或者在登录时??您应该在身份验证后设置主体。