asp.net identityserver4代码流访问令牌上的访问群体声明错误

unhi4e5o  于 2023-02-14  发布在  .NET
关注(0)|答案(1)|浏览(112)

我正在使用Identityserver4的vuejs客户端的代码流。我添加了RequirePkce,我可以从oidc-client获得访问令牌和id令牌。但访问令牌aud声明指向Identityserver4基址,而不是我的API资源。可能有什么问题吗?
委托单位:

new Client
                {
                    ClientId = "js.admin",
                    ClientName = "admin dashboard vuejs client.",

                    RequirePkce = true,
                    RequireClientSecret = false,
                    RequireConsent = false,
                    AllowedGrantTypes = GrantTypes.Code,
                    AllowAccessTokensViaBrowser = true,

                    RedirectUris = new List<string>
                    {
                        "http://localhost:8080",
                        "http://localhost:8080/logincb.html",
                        "http://localhost:8080/silent-renew.html"
                    },
                    PostLogoutRedirectUris = new List<string>
                    {
                        "http://localhost:8080/",
                        "http://localhost:8080"
                    },
                    AllowedCorsOrigins = new List<string>
                    {
                        "http://localhost:8080"
                    },
                    AllowedScopes = new List<string>
                    {
                        "openid",
                        "role",
                        "profile",
                        "api1.rw",
                        "email",
                        "phone"
                    }
                }

oidc客户端设置:

const clientSettings = {
      userStore: new WebStorageStateStore({ store: window.localStorage }),
      authority: STS_DOMAIN,
      client_id: "js.admin",
      redirect_uri: "http://localhost:8080/logincb.html",
      automaticSilentRenew: true,
      silent_redirect_uri: "http://localhost:8080/silent-renew.html",
      response_type: "code",
      scope: "openid profile api1.rw role email phone",
      post_logout_redirect_uri: "http://localhost:8080/",
      filterProtocolClaims: true
    };

访问令牌已解码:

"iss": "http://localhost:5001",
 "aud": "http://localhost:5001/resources",

正如你所看到的,发行者和受众的声明都是一样的,都是错误的。
但即使是瞄准镜也是正确的我真的很感激任何帮助。

Bearer was not authenticated. Failure message: IDX10214: Audience validation failed. Audiences: 'http://localhost:5001/resources'. Did not match: validationParameters.ValidAudience: 'api1' or validationParameters.ValidAudiences: 'null'.

这是我得到的最后一个错误。

h79rfbju

h79rfbju1#

http://localhost:5001/resources是一个通用资源,当您尚未定义任何ApiResources或将其与请求的ApiScope关联时,会添加该资源。
从文档here中可以看出:
使用仅作用域模型时,不会向令牌添加aud(受众)声明,因为此概念不适用。如果需要aud声明,可以在选项上启用EmitStaticAudienceClaim设置。这将以issuer_name/resources格式发出aud声明。如果需要对aud声明进行更多控制,请使用API资源。
要获取api1.rw作为您的受众,您需要将ApiResource添加到IdentityServer配置中。您可以将ApiResourceApiScope*api1.rw**命名为
为了补充这个答案,我写了一篇博客文章,对这个主题进行了更详细的讨论:IdentityServer – IdentityResource vs. ApiResource vs. ApiScope

相关问题