将承载令牌添加到依赖注入

时间:2017-07-28 11:18:56

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

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

现在,如果我想给我打电话,我可以做以下事情。但是我必须将访问令牌传递给调用我的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或类似的东西?

由于

中号

1 个答案:

答案 0 :(得分:1)

在进行了一些调查后,我发现了一种方法。在这里使用这个答案

using simple injector in mvc6 with cookie auth

并查看如何

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

我做了它创建了一个ITokenManager和一个TokenManager,然后通过DI访问了IHttpContextAccessor,这使得我可以获得令牌。