- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 IdentityServer 4 中使用 .net 核心。我有一个 Web api 和一个访问 api 上的安全端点的 MVC 应用程序。它的设置与 IdentityServer 快速入门非常相似:
https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity
我发现我的 access_tokens
即将到期,我想了解如何重新协商 refresh_tokens
。
以下面的代码为例(取自快速入门here):
public async Task<IActionResult> CallApiUsingUserAccessToken()
{
var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
var client = new HttpClient();
client.SetBearerToken(accessToken);
var content = await client.GetStringAsync("http://localhost:5001/identity");
ViewBag.Json = JArray.Parse(content).ToString();
return View("json");
}
如果 access_token
已过期,它将失败并返回 401 响应。是否有使用 refresh_token
重新协商 access_token
的内置机制?
最佳答案
没有内置系统来刷新access_token
。但是,您可以使用 IdentityModel
包来请求带有 refresh_token
的新 access_token
。
Client
有一个属性 AllowOfflineAccess
,您应该在 IdentityServer 中将其设置为 true。请注意,这对隐式/客户端凭据流不起作用。
access_token
是否即将过期,方法是检查其生命周期并使用 refresh_token
请求新的 access_token
(个人偏好)refresh_token
请求新的 access_token
在此代码之前,您可以检查 access_token
生命周期和/或在请求新的 access_token
之前将此代码包装在服务中
var discoveryResponse = await DiscoveryClient.GetAsync("IdentityServer url");
if (discoveryResponse.IsError)
{
throw new Exception(discoveryResponse.Error);
}
var tokenClient = new TokenClient(discoveryResponse.TokenEndpoint, "ClientId", "ClientSecret");
// This will request a new access_token and a new refresh token.
var tokenResponse = await tokenClient.RequestRefreshTokenAsync(await httpContext.Authentication.GetTokenAsync("refresh_token"));
if (tokenResponse.IsError)
{
// Handle error.
}
var oldIdToken = await httpContext.Authentication.GetTokenAsync("id_token");
var tokens = new List<AuthenticationToken>
{
new AuthenticationToken
{
Name = OpenIdConnectParameterNames.IdToken,
Value = oldIdToken
},
new AuthenticationToken
{
Name = OpenIdConnectParameterNames.AccessToken,
Value = tokenResult.AccessToken
},
new AuthenticationToken
{
Name = OpenIdConnectParameterNames.RefreshToken,
Value = tokenResult.RefreshToken
}
};
var expiresAt = DateTime.UtcNow.AddSeconds(tokenResult.ExpiresIn);
tokens.Add(new AuthenticationToken
{
Name = "expires_at",
Value = expiresAt.ToString("o", CultureInfo.InvariantCulture)
});
// Sign in the user with a new refresh_token and new access_token.
var info = await httpContext.Authentication.GetAuthenticateInfoAsync("Cookies");
info.Properties.StoreTokens(tokens);
await httpContext.Authentication.SignInAsync("Cookies", info.Principal, info.Properties);
取自并稍作修改:Source
关于c# - 如何在 IdentityServer 4 中使用 'refresh_token'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44175115/
我正在与一个显然需要 OAuth 身份验证的自定义 APEX 服务进行交互。我可以轻松地对我的应用程序进行身份验证和授权。一切正常。 但是,我收到的访问 token 往往会过期。 当然,我可以通过发送
我有一个使用 oauth2 连接到第三方应用程序的 C# 应用程序。首先,用户被重定向到一个外部应用程序 (ERP),他在其中输入用户名和密码,并生成一个有效期为 1 小时的访问 token 和一个有
我对 refresh_token 有疑问。我完全不明白。我读到我只在登录后第一次获得此 token ,之后不会返回 refresh_token。第一种方法是初始化 gapi: initGp: func
我有一个有两条路由的小型 express 服务器。然后它将 json token 写入文件(我知道非常不安全)。由于某种原因,没有 refresh_token。在文档中有一条评论说 offline f
我将 google API 用于个人项目,因此我的应用没有通过 google 验证。 我完全使用 this我自己的代码示例和登录时生成的 token.json 文件。一切正常,每次我发出请求(每 10
背景 我使用 google-api-python-client django_sample 获得了 Google API 的 access_token . 为了离线访问,我添加了 FLOW.param
我写了一个关于使用 google api 的例子。 Google NodeJS Client library .我遵循了指令集 access_type : 'offline',但是返回的对象不包含 r
我在 IdentityServer 4 中使用 .net 核心。我有一个 Web api 和一个访问 api 上的安全端点的 MVC 应用程序。它的设置与 IdentityServer 快速入门非常相
我正在阅读 OAuth2 规范: https://www.rfc-editor.org/rfc/rfc6749#section-4.4.2 特别是关于 client_credentials 的部分授予
我在Grails 3应用程序中使用Spring Security Rest发出“refresh_token”请求时遇到了一些麻烦。我有一个同时具有Web前端和一些Rest端点的应用程序,其他所有东西似
我正在使用的项目:来自 nuget 的 ImgurNet(来源:https://github.com/0xdeafcafe/ImgurNet) 它似乎需要所有这些参数: { "client_i
我对 refresh_token 流程(http://wiki.developerforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com)的
您好,我是计算机科学专业的学生,正在 oauth.io 上做一些实验。但我在成功获取代码后获取刷新 token 时遇到问题。获取代码后,我正在编写以下代码行,但它给了我内部服务器错误.. 代码是
我正在使用 omniauth-coinbase和 coinbase-ruby在我的 Rails 应用程序中。 在我的应用程序中,用户通过 Coinbase 登录,Coinbase 生成一个 code,
所以我通过这种方式获得了一个刷新 token ,我可以保留它吗? 如果可以,下次要怎么用才能不用开浏览器? 现在我正在考虑直接创建 OAuth2Credentials 对象,这是正确的方法吗? fro
我将 HWIO Bundle 用于 google api,当我收到来自 google refreshToken = null 的响应时,为什么?如何刷新 token oAuthToken = {HWI
如果用户的 access_token 过期并且用户想保持登录状态,我需要让用户在系统中保持登录状态。如何在 Keycloak 上使用 refresh_token 获取新更新的 access_token
我的 axios 响应中有以下拦截器: window.axios.interceptors.response.use( response => { return response; }
我正在使用 FLask Framework 构建网站 + 后端我在其中使用 Flask-OAuthlib与谷歌进行身份验证。身份验证后,后端需要定期扫描用户的 Gmail。因此,当前用户可以验证我的应
根据 https://groups.google.com/forum/#!forum/oauth2-dev讨论现在在这里。 无论我读了多少书,我都无法理解 google OAuth2 token 的工
我是一名优秀的程序员,十分优秀!