【发布时间】:2020-03-27 10:16:23
【问题描述】:
我正在使用 here 找到的 IdentityServer4 "AspNetCoreAndApis" 示例应用程序
它有一个令牌服务器和一个 MVC 客户端应用程序。
身份服务器项目使用他们的演示服务器设置了一个外部 OIDC 身份验证提供程序 - https://demo.identityserver.io/
在到达MvcClient中的受保护端点后,被重定向到本地身份服务器,选择演示服务器并进行身份验证,然后到达本地身份服务器的ExternalController回调。在这一点上,我想向用户发出额外的声明,并让它们在MvcClient 中可用。
回调中有代码添加additionalLocalClaims 并发出cookie。我尝试添加另一个声明:
var additionalLocalClaims = new List<Claim>();
additionalLocalClaims.Add(new Claim("TestKey", "TestValue"));
await HttpContext.SignInAsync(user.SubjectId, user.Username, provider, localSignInProps, additionalLocalClaims.ToArray());
但是当用户到达HomeController 的MvcClient 时,这个声明已经不存在了。
我想我没有正确理解在哪里使用了哪种身份验证方案,以及相关 cookie 的功能。
编辑:
针对下面的第一条评论,我尝试将声明附加到请求的范围,但仍然没有运气 - 这是内存中的资源存储:
public static IEnumerable<ApiResource> Apis
{
get
{
var apiResource = new ApiResource("api1", "My API");
apiResource.UserClaims.Add("TestKey");
var resources = new List<ApiResource>
{
apiResource
};
return resources;
}
}
MvcClient 被允许使用 api1 范围,并请求它。
【问题讨论】:
-
应该可以,但是您还必须允许用户通过将其附加到用户请求的范围来接收声明。例如。如果这旨在作为访问令牌声明,您可以将声明类型添加到 api1 ApiResource(假设用户正在请求 api1 范围)。
-
我真的认为这会奏效,但恐怕它没有。我编辑了我的问题以包含您的建议。
-
要理解的几件事可能会帮助您解决它:首先是 - 正如我的第一条评论所暗示的那样 - 您可以按照自己的方式添加任何合理数量的声明,但它们应该被视为 可用声明。 发布的实际声明将取决于您的 IS4 配置(范围、API、客户端、身份资源等)。
-
其次是identity-tokens和access-tokens的区别。第一个由您的 UI 接收,通常以明文 JWT 的形式出现,并且可供您的 UI 使用。第二个是针对您的目标 API 的,通常(或至少应该被视为)对您的 UI 不透明。您只需将其从 UI 传递到 API 即可获得访问权限,而且通常只有 API 才能看到实际声明。如果您正在寻找第一个出现的新声明,则应将其添加到匹配的 IdentityResource,而不是 ApiResource。
-
顺便说一句,您在添加时也将您的声明称为“TestKey”,但将“CustomKey”添加到 ApiResource...
标签: asp.net-core identityserver4