asp.net-mvc - UnauthorizedAccessException 使用需要访问令牌的 API
问题描述
我正在开发一个 .netcore 1.1 MVC 应用程序,它是一个使用 IdentityServer4 授权的 Open ID Connect 客户端。它还使用需要授权的 API。
目前,当访问令牌过期并调用 API 时,我遇到了System.UnauthorizedAccessException '试图执行未经授权的操作'。
我似乎无法弄清楚如何解决它。
这是客户端的配置方式(注意 API 已添加到 Scope):
在Startup.cs中,我注册了我要消费的API,如下:
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions()
{
AuthenticationScheme = "oidc",
SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme,
Authority = identityServerServiceOptions.GetValue<string>("AuthorityUrl"),
RequireHttpsMetadata = false,
ResponseType = OpenIdConnectResponseType.CodeIdToken,
ClientId = identityServerServiceOptions.GetValue<string>("ClientId"),
ClientSecret = identityServerServiceOptions.GetValue<string>("ClientSecret"),
GetClaimsFromUserInfoEndpoint = true,
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
NameClaimType = "name",
RoleClaimType = "role"
},
SaveTokens = true,
Scope =
{
"[APIName]",
"roles",
"offline_access"
}
});
客户端在 IdentityServer4 表“ClientScopes”中定义了以下范围:
- 角色
- 电子邮件
- 轮廓
- 打开ID
- 离线访问
- [API 名称]
此外,[APIName] 已添加到 ApiResources、ApiClaims 和 ApiScopes。
我已经尝试过:
- 将客户端中的 AllowOfflineAccess 设置为“真”
- 将客户端中的 UpdateAccessTokenClaimsOnRefresh 设置为“真”
解决方案
如果您的访问令牌过期,您将需要使用您在登录期间获得的刷新令牌对其进行更新。
推荐阅读
- java - 将参数传递给 @JsonSerialize 和 @JsonDeserialize 中使用的 Java 类
- git - 是否可以使用 `git filter-repo` 从 git 存储库中删除特定版本的文件?
- javascript - TypeError:无法读取动态参数节点js中未定义的属性“id”
- android - 如何将自定义按钮应用于 Android Studio 中的活动?
- jwt - 无法使用 JWT 令牌加载 Mapkit 进行授权
- bash - Bash 问题:用 '~/Desktop/music' 替换 'C:\Music' 的 sed 命令
- python - 避免 if 内循环
- django - 如何在没有原始迁移文件的情况下更新 django 中的 sqlite 数据库并同时保留 db.sqlite3 中的数据?
- wsl-2 - 有没有办法在 WSL2 上启用显示?
- vue.js - 如何使用vue Element-plus在不同的特定选项卡中修改相同的内容而不影响另一个选项卡