我有身份服务器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或类似的东西?
由于
中号
答案 0 :(得分:1)
在进行了一些调查后,我发现了一种方法。在这里使用这个答案
using simple injector in mvc6 with cookie auth
并查看如何
https://github.com/dotnet-architecture/eShopOnContainers
我做了它创建了一个ITokenManager和一个TokenManager,然后通过DI访问了IHttpContextAccessor,这使得我可以获得令牌。