我知道很多人可能不同意这种实现,但我希望将 jwt 存储在仅限 http 的容器中,以防止 javascript 访问令牌。一旦用户通过身份验证,.NET 应用程序就会从 Identity Server 检索 Jwt。然后我想创建一个仅限 http 的 cookie 并将 jwt 存储在其中,然后将其发送到 api 进行授权。
我想问我如何将此cookie发送到api以及如何让api访问cookie中的jwt并使用身份服务器进行身份验证(我知道我可以使用身份服务器上的自省端点来检查是否jwt 有效)。
我目前正在尝试使用 RestSharp 从应用程序发送请求:
var oClient = new RestClient("http://localhost:52298/stockcontrol/availablestock");
var oContainer = new CookieContainer();
var oRequest = new RestRequest();
oRequest.Method = Method.GET;
var oCookie = new Cookie("Jwt", sJwt) { HttpOnly = true, Expires = DateTime.Now.AddMinutes(10), Domain = "test" };
oContainer.Add(oCookie);
oClient.CookieContainer = oContainer;
var oResponse = oClient.Execute(oRequest);
这是我试图用来验证 api 上的 jwt 的代码:
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
Provider = new CookieAuthenticationProvider()
{
OnValidateIdentity = async context =>
{
if (context?.Identity?.IsAuthenticated ?? false)
{
var accessToken = context?.Identity?.Claims?.FirstOrDefault(x => x.Type == "access_token")?.Value;
if (accessToken == null)
{
context?.RejectIdentity();
}
else
{
var client = new IntrospectionClient(
sISUrl + "connect/introspect",
sISClientName,
sISClientSecret); // auth as scope, not client!
var validationResult = await client.SendAsync(new IntrospectionRequest()
{
Token = accessToken
});
if (validationResult.IsError || !validationResult.IsActive)
{
context?.RejectIdentity();
}
}
}
}
}
});