【问题标题】:How do I grant users access to specific APIs with IdentityServer4?如何使用 IdentityServer4 授予用户对特定 API 的访问权限?
【发布时间】:2020-02-17 09:50:42
【问题描述】:

我正在构建一个新的安全令牌服务(在 ASP.NET Core 上运行 IdentityServer4),并且需要让登录到前端应用程序的用户只能访问某些 API。

到目前为止,我能够让用户登录到 JS 客户端,并通过访问配置为特定 JS 客户端令牌服务上允许范围的 API 的权限获得授权/身份验证。

我希望做的是将每个用户配置为只能访问某些 API - 不一定是允许范围内的所有 API。

我是新手,所以我什至不确定我问的问题是否正确。但是,我希望它仍然可以理解,并且很乐意回答任何问题。


我如何在令牌服务中定义我的用户:

new TestUser
{
    SubjectId = "05624",
    Username = "asd",
    Password = "asd",
    Claims = new []
    {
        new Claim("name", "My Name"),
        new Claim("email", "myname@email.net")
    }
}

我如何在令牌服务中定义我的客户端:

new Client
{
    ClientId = "js-demo"
    AllowedGrantTypes = GrantTypes.Code,
    AllowedScopes = 
    { 
        "openid", 
        "api_1",
        "api_2"
    },
    AllowedCorsOrigins = { "http://localhost:5000" },
    RedirectUris = { "http://localhost:5000/callback.html" },
    PostLogoutRedirectUris = { "http://localhost:5000/index.html" },
    RequirePkce = true,
    RequireClientSecret = false,
    AllowAccessTokensViaBrowser = true
}

我如何在令牌服务中定义我的 API 资源:

new List<ApiResource>
{
    new ApiResource("api_1"),
    new ApiResource("api_2")
};

我如何定义我的前端客户端:

var config = {
    client_id: "js-demo",
    response_type: "code",
    scope: "openid api_1 api_2",
    authority: "http://localhost:9999",
    redirect_uri: "http://localhost:5000/callback.html",
    post_logout_redirect_uri: "http://localhost:5000/index.html"
};

【问题讨论】:

  • 那是用户授权,不一定要在IdentityServer级别实现,实际上也是not recommended there。他们的授权解决方案是PolicyServer。您还可以使用其他授权解决方案,例如 resource-based authorization
  • 谢谢!我发现的一件事是,我可以设置每个用户对应用程序访问的同意。我使用 IdentityServer4 的 GitHub 中的快速入门示例找到了这一点。这与授予用户访问特定 API 资源的权限不同吗?
  • 客户端代表用户提出请求,但前提是用户同意(这是可配置的)。这意味着用户可以拒绝客户端访问某个资源。这让用户可以控制。

标签: javascript asp.net asp.net-core identityserver4 openid-connect


【解决方案1】:

IdentityServer 并不打算这样做。它授予应用程序使用用户身份的权限,而不是用户使用应用程序的权限。

如果您只是构建一个简单的系统,您可以为用户分配role 声明,并在您的应用程序中制定策略,根据用户的角色允许/禁止用户。但随着您的权限逻辑不断增长,这将变得难以管理。

看看 PolicyServer,他们对您遇到的问题有很好的介绍。 https://policyserver.io/

【讨论】:

  • 谢谢。正如我上面评论的那样,我刚刚发现使用来自 IdentityServer4 的 GitHub 的快速入门示例 - 我可以允许用户登录的同意,并选择我希望同意的 API 资源。这和只允许用户访问某些 API 不一样吗?
  • 我说的第一句话就是这个意思。 :) 是用户允许应用程序访问他们的数据。因此,您可以让您的日历使用您的通讯录。 (API 资源),或者您可以让日历访问您的生日(身份资源)。
  • 你不能做的是限制哪些用户可以访问哪些 API,即授权,而不是身份验证,这不属于 IdentityServer4 的范围。同样,您可以通过分配给用户的声明来执行此操作,但不建议这样做。
  • 哦,我明白了——我想我现在明白了。再次感谢!进一步调查 PolicyServer,它开始变得有意义了。
  • 这是一个艰难的过程.. 很高兴我能提供帮助。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2012-03-10
相关资源
最近更新 更多