【问题标题】:how to share the token between classes如何在类之间共享令牌
【发布时间】:2014-11-12 09:39:58
【问题描述】:

我在使用 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,我正在使用它在所有 ApiController 之间共享某些功能。

然后我为某些未共享的功能指定了一些 ApiController。

现在在进行日志记录时,我确实想记录登录用户名,问题是我每次创建新实例时都必须传递它,有没有办法可以使当前登录用户名全局api 请求,以便它可以在任何地方访问。

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

有没有办法可以避免每次都通过它。鉴于webapi是无状态的,所以无法使用session,还有什么办法吗??

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

注意:

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

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

【问题讨论】:

  • 您是否尝试过使用Thread.CurrentPrincipal.Identity.Name
  • 我在客户端使用 angularjs,因此到目前为止没有设置任何与 CurrentPrincipal 相关的内容。但如果你能分享我如何设置它的代码,那就太好了......

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


【解决方案1】:

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

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

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

【讨论】:

  • 但是我应该在哪里初始化 Principal,在 BaseApiController 中?还是登录??
  • 认证后设置主体。
猜你喜欢
  • 2021-06-21
  • 2021-07-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2020-01-31
  • 2012-09-21
相关资源
最近更新 更多