【发布时间】: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