gpt4 book ai didi

asp.net-mvc - 使用 IdentityServer 4 时如何在 Api 项目中添加附加声明

转载 作者:行者123 更新时间:2023-12-03 02:31:33 26 4
gpt4 key购买 nike

抱歉我的英语不好。

我有三个项目:IdentityServer、Ensino.Mvc、Ensino.Api。 IdentityServer 项目提供来自 IdentityServer4 库的主要身份信息和声明 - 声明配置文件、声明地址、声明 Sid...等。 Ensino.Mvc 项目在 token 中获取此信息并将其发送到 API,以便 MVC 有权访问资源。该 token 包含 IdentityServer 提供的所有声明。但在 API 中,我需要生成特定于 API 的其他声明,例如:与 token 中的声明 Sid 相对应的声明 EnrollmentId。我还想在 HttpContext 中添加此声明以供将来使用。有人可以告诉我如何实现这一目标吗?

我在 Startup.ConfigureServices 中有此代码:

// Add identity services
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5100";
options.RequireHttpsMetadata = false;
options.ApiName = "beehouse.scope.ensino-api";
});

// Add mvc services
services.AddMvc();

在其他项目中,没有 API,只有 mvc,我继承了 UserClaimsPrincipalFactory 并重写了 CreateAsync 以添加其他声明。我喜欢在 API 项目中做类似的事情。可能吗?

执行此操作的最佳方法是什么?

编辑:经过一番研究,我想做的是:根据声明和特定的 api 数据库数据,通过 IdentityServer 进行身份验证并在 api 中设置授权。

最佳答案

在您的 API 项目中,您可以将自己的事件处理程序添加到 options.JwtBearerEvents.OnTokenValidated。这是设置 ClaimsPrincipal 的地方,您可以向身份添加声明或向主体添加新身份。

services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5100";
options.RequireHttpsMetadata = false;
options.ApiName = "beehouse.scope.ensino-api";

options.JwtBearerEvents.OnTokenValidated = async (context) =>
{
var identity = context.Principal.Identity as ClaimsIdentity;

// load user specific data from database
...

// add claims to the identity
identity.AddClaim(new Claim("Type", "Value"));
};
});

请注意,这将在对 API 的每个请求上运行,因此如果您要从数据库加载信息,最好缓存声明。

此外,Identity Server 应该只负责识别用户,而不是他们做什么。它们所做的事情是特定于应用程序的(角色、权限等),因此您正确地认识到了这一点并避免了与 Identity Server 的逻辑交叉。

关于asp.net-mvc - 使用 IdentityServer 4 时如何在 Api 项目中添加附加声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com