gpt4 book ai didi

asp.net-web-api - 如何在 IdentityServer4 中运行时添加/管理用户声明

转载 作者:行者123 更新时间:2023-12-02 02:25:35 24 4
gpt4 key购买 nike

我正在尝试在新项目中使用 IdentityServer4。我在 PluralSight 视频“了解 ASP.NET Core 安全性”中看到,IdentityServer4 可以与基于声明的安全性结合使用来保护 Web API。我已将 IdentityServer4 设置为单独的项目/解决方案。

我还发现您可以添加 IProfileService 来将自定义声明添加到 IdentityServer4 返回的 token 中。

一项计划是向用户添加新的声明,以授予他们访问 API 不同部分的权限。但是我不知道如何从 api 项目管理 IdentityServer 上的用户声明。我认为我应该调用 IdentotyServer4 来添加和删除用户声明?

此外,这通常是一个好方法,因为我不确定允许客户端出于自己的内部安全目的向 IdentityServer 添加声明是否有意义 - 并且可能会导致冲突(例如,多个客户端使用“角色”声明值“管理员”)。也许我应该在 api 项目内部本地处理安全性,然后使用“sub”声明来查找它们?

有人对此有好的方法吗?

谢谢

最佳答案

老问题但仍然相关。正如leastprivilege在评论中所说

claims are about identity - not permissions

这确实是事实,但身份还可能涉及用户的类型(管理员、用户、经理等),可用于确定 API 中的权限。也许设置具有特定权限的用户角色?本质上,如果 CLIENT1-Admin 不应具有与 CLIENT2-Admin 相同的权限,您还可以在客户端之间拆分角色,以获得更多控制。

因此,将您的角色作为 IProfileService 中的声明传递。

public class ProfileService : IProfileService
{
private readonly Services.IUserService _userService;

public ProfileService(Services.IUserService userService)
{
_userService = userService;
}

public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
try
{
switch (context.Client.ClientId)
{
//setup profile data for each different client
case "CLIENT1":
{
//sub is your userId.
var userId = context.Subject.Claims.FirstOrDefault(x => x.Type == "sub");

if (!string.IsNullOrEmpty(userId?.Value) && long.Parse(userId.Value) > 0)
{
//get the actual user object from the database
var user = await _userService.GetUserAsync(long.Parse(userId.Value));

// issue the claims for the user
if (user != null)
{
var claims = GetCLIENT1Claims(user);

//add the claims
context.IssuedClaims = claims.Where(x => context.RequestedClaimTypes.Contains(x.Type)).ToList();
}
}
}
break;
case "CLIENT2":
{
//...
}
}
}
catch (Exception ex)
{
//log your exceptions
}
}

// Gets all significant user claims that should be included
private static Claim[] GetCLIENT1Claims(User user)
{
var claims = new List<Claim>
{
new Claim("user_id", user.UserId.ToString() ?? ""),
new Claim(JwtClaimTypes.Name, user.Name),
new Claim(JwtClaimTypes.Email, user.Email ?? ""),
new Claim("some_other_claim", user.Some_Other_Info ?? "")
};

//----- THIS IS WHERE ROLES ARE ADDED ------
//user roles which are just string[] = { "CLIENT1-Admin", "CLIENT1-User", .. }
foreach (string role in user.Roles)
claims.Add(new Claim(JwtClaimTypes.Role, role));

return claims.ToArray();
}
}

然后将[Authorize]属性添加到您的 Controller 以获得特定权限。这仅允许特定角色访问它们,因此设置您自己的权限。

[Authorize(Roles = "CLIENT1-Admin, CLIENT2-Admin, ...")]
public class ValuesController : Controller
{
//...
}

上面的这些声明也可以通过身份验证传递,例如,如果您使用具有自定义 ResourceOwnerPasswordValidator 的 ResourceOwner 设置。您可以在验证方法中以相同的方式传递声明,如下所示。

context.Result = new GrantValidationResult(
subject: user.UserId.ToString(),
authenticationMethod: "custom",
claims: GetClaims(user));

因此,就像leastprivilege所说,您不想使用IdentityServer来设置权限并将其作为声明传递(例如谁可以编辑什么记录),因为它们太具体并且使 token 困惑,但是设置的角色 -

grant them access to different parts of the api.

这对于用户角色来说非常合适。

希望这有帮助。

关于asp.net-web-api - 如何在 IdentityServer4 中运行时添加/管理用户声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43469229/

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