有没有人知道将什么用作一般授权服务,并有一个工作代码示例或良好的实现步骤如何实现这样的事情。
我花了很多时间来寻找我所追求的,但还没有找到任何满意的解决方案。
IdentityServer 不是一个选项,而由于令牌的大小,我的权限不能存储为声明。它带有大约 200 个权限,因此应该在 dbcontext 或其他东西中完成。
我查看了 PolicyServer,但它没有按预期工作。当我在 IS4 应用程序中安装它时,它可以在 IS4 控制器上运行,但是当从外部应用程序调用 Authorize 时,它根本不会调用 Authorize 覆盖,因为它应该检查权限。而且似乎在 User.Claims 或其他任何外部应用程序中都没有设置权限。我错过了一些我认为的设置。
我想要完成的是我有一个权限存储(表)(例如包含一堆索引、添加、编辑或删除按钮等等)。应该提供给登录的经过身份验证的用户。但是这个单一的权限存储应该在我运行的所有应用程序或 API 中都可用,以便 Authorize 属性可以完成他的工作。
我认为这不应该那么难做,所以我错过了一个很好的工作示例,如何实现这样的事情以及什么是有效的。谁能帮我完成这件事?
我编写了一些代码来通过 API 调用获取权限并在 IsInRole 覆盖中使用它。但是当我使用 Authorize attr 声明它时,它不会进入方法:
[ApiController]
1) [Authorize]
public class AuthController : ControllerBase
{
private readonly IdentityContext _context;
public AuthController(IdentityContext context)
{
_context = context ?? throw new ArgumentNullException(nameof(context));
}
[HttpGet()]
[Route("api/auth/isinrole")]
public bool IsInRole(string role)
{
2) if (User.FindFirst("sub")?.Value != null)
{
var userID = Guid.Parse(User.FindFirst("sub")?.Value);
if([This is the code that checks if user has role])
return true;
}
return false;
这是 IsInRole 覆盖(ClaimsPrincipal.IsInRole 覆盖):
public override bool IsInRole(string role)
{
var httpClient = _httpClientFactory.CreateClient("AuthClient");
3) var accessToken = _httpContextAccessor.HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken).Result;
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var request = new HttpRequestMessage(HttpMethod.Get, "/api/auth/isinrole/?id=" + role);
var response = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;
etc...
- 当它没有在请求中发送 access_token 时,这不起作用
- 'sub' 未发送
- 始终为空