在IdentityServer4中限制用户级别上的api资源

在IdentityServer4中限制用户级别上的api资源,api,oauth,identityserver4,oidc-client-js,Api,Oauth,Identityserver4,Oidc Client Js,我们希望利用IdentityServer4建立一个通用身份验证服务,在这里我们定义一组可以访问一个或多个api的用户 用户将是全局定义的,但只能访问特定的api 也许我遗漏了什么,但这似乎没有得到支持。如果用户经过身份验证并收到访问令牌,则他可以访问所有api 我已经阅读了这篇博文,我完全理解并同意授权应该在客户机应用程序本身中处理,但是第一级检查用户是否可以访问api对我来说似乎微不足道 我以前使用过Azure AD和ADAL,在Azure AD中,可以定义用户可以访问的应用程序(=Ident

我们希望利用IdentityServer4建立一个通用身份验证服务,在这里我们定义一组可以访问一个或多个api的用户

用户将是全局定义的,但只能访问特定的api

也许我遗漏了什么,但这似乎没有得到支持。如果用户经过身份验证并收到访问令牌,则他可以访问所有api

我已经阅读了这篇博文,我完全理解并同意授权应该在客户机应用程序本身中处理,但是第一级检查用户是否可以访问api对我来说似乎微不足道

我以前使用过Azure AD和ADAL,在Azure AD中,可以定义用户可以访问的应用程序(=IdentityServer4术语中的资源)。请求令牌时,指定要访问的资源,如果用户无权访问,则不会返回访问令牌


有人能告诉我什么是正确的设置方法吗?我们的大多数应用程序都是Angular SPA应用程序,因此我们使用隐式流。

您可以设置访问不同API的不同客户端。用户只需验证客户端,就可以访问该API。这不会阻止user1对您不希望他们访问的api进行身份验证

您还可以设置用户声明和策略,以防止不同的用户访问不同的API。这样做可以确保只有21岁以上的用户才能访问此api

[Authorize(Policy = "AtLeast21")]
public class AlcoholPurchaseController : Controller
{
    public IActionResult Login() => View();

    public IActionResult Logout() => View();
}

更多信息可在此处找到

正确的方法是使用或授权

Identity server正在进行身份验证(检查客户端是否已注册,是否允许其访问请求的作用域,对用户进行身份验证,并向其提供声明),但授权用户(根据声明中的角色,允许或不允许访问某个方法)取决于您的应用程序(客户端)


在根据ID进行身份验证时,您可以选择检查clientID和用户,并编写一些自定义代码,在其中可以应用一些规则并拒绝用户。

我建议您采用这种方式进行身份验证

  • 对用户进行身份验证,并确保其返回access_令牌和certian声明信息
  • 在数据存储中或您可以阅读的地方定义授权规则,以便将声明映射到权限/属性
  • 现在编写一个授权逻辑或服务,您可以在其中映射步骤2中的有效权限并查找权限
    这将使您的身份和授权保持干净和独立,并且仅根据需要更新应用程序规则以映射一般权限

    身份服务是执行用户授权的错误位置。如果您确实希望,您可以实现一个定制的授权请求验证器来执行额外的检查。