【问题标题】:Adding bearer token to dependency injection将不记名令牌添加到依赖注入
【发布时间】:2017-07-28 11:18:56
【问题描述】:

我设置了身份服务器 4,我的 mvc 客户端重定向到身份服务器,我可以对用户进行身份验证。

现在,如果我想调用我的 API,我可以执行以下操作。但是我必须将访问令牌传递给调用我的 api 的方法。

控制器

public class UserController : Controller
{
    public IActionResult Index()
    {
        var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");

        var user = _userService.Get(accessToken);
        return View();
    }
}

服务

public async Task<User> Get(string accessToken)
{
    var result =  await _baseUrl.AppendPathSegment("/v1/User/Get").WithOAuthBearerToken(accessToken).GetJsonAsync<User>();

    return result;
}

我更愿意将访问令牌添加到依赖注入管道中,这样我就可以将它用作类中的全局对象,而不必担心每次调用都会传递它。

public class UserService
{
    private readonly string _bearerToken {get;set;}

    public UserService(IOptions<UserSettings> userSettings)
    {
        _bearerToken  = userSettings.Value.BearerToken;
    }

    public async Task<User> Get(string accessToken)
    {
        var result =  await _baseUrl.AppendPathSegment("/v1/User/Get").WithOAuthBearerToken(_bearerToken ).GetJsonAsync<User>();

        return result;
    }
}

我不完全确定这是否是正确的做法?如果是,那么我不确定如何。我想可能是 OnTokenValidated 事件的一部分。

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    // Other settings here

    Events = new OpenIdConnectEvents
    {
        OnTokenValidated = context =>
        {
            var accessToken = context.SecurityToken as JwtSecurityToken;

            if (accessToken != null)
            {
                // Over here add the accessToken to IOptions<UserSettings>
            }

            return Task.CompletedTask;
         }
   },
}

OnTokenValidated 事件是执行此操作的正确位置吗?这会在页面加载之间维护令牌还是我应该在其他地方这样做? 我将如何将 accessToken 添加到 IOptions 或类似的东西中?

谢谢

M

【问题讨论】:

    标签: dependency-injection asp.net-core identityserver4 bearer-token


    【解决方案1】:

    经过更多调查后,我找到了一种方法。在这里使用这个答案

    using simple injector in mvc6 with cookie auth

    看看怎么样

    https://github.com/dotnet-architecture/eShopOnContainers

    是不是我创建了一个 ITokenManager 和一个 TokenManager,然后通过 DI 访问了 IHttpContextAccessor,这让我可以获取令牌。

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 2021-03-15
      • 1970-01-01
      • 2018-03-27
      • 2020-11-25
      • 2021-09-28
      • 2015-12-04
      • 1970-01-01
      • 2015-12-29
      相关资源
      最近更新 更多