我有一个具有以下范围的API(api_access和offline_access):
还有一个使用代码流并使用该 api 的前端 blazor 应用程序。以下是我配置身份验证的方式:
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.Authority = "xxxxx";
options.ClientId = "xxxxx";
options.ResponseType = "code";
options.SaveTokens = true;
options.Scope.Add("api://xxxxx/api_access");
options.ClientSecret = "xxxxx";
这是我请求访问代码来调用 api 的方式:
var access_token = await httpContext.GetTokenAsync("access_token");
这可行,但访问令牌将在一小时后过期。当我在过期后再次调用
httpContext.GetTokenAsync("access_token")
时,我没有得到新的令牌。如何获取新的有效令牌?
根据您的设计,您可以使用
refresh_token
来获取新的 access_token
。您需要使用您的 /token
调用 refresh_token
端点。
从文档复制的示例。
POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&refresh_token=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq...
&grant_type=refresh_token
&client_secret=sampleCredentia1s
但是,可能有一些库可以处理客户端的琐事。