【问题标题】:IdentityServer3: Deny access to given scope based on user claimsIdentityServer3:根据用户声明拒绝访问给定范围
【发布时间】:2017-01-25 13:03:38
【问题描述】:

我有一个包含 2 个区域的 WebAPI - 用户和管理员。 2 个站点,用户和管理员,使用它,他们有自己的客户端 ID。

    public static readonly Scope AdminScope = new Scope
    {
        Name = "adm_api",
        Type = ScopeType.Resource,
        Claims = new List<ScopeClaim>
        {
            new ScopeClaim(Constants.ClaimTypes.Role),
            new ScopeClaim(VitClaimTypes.IsAdmin)
        },
    };

    public static readonly Scope UserScope = new Scope
    {
        Name = "user_api",
        Type = ScopeType.Resource,
        Claims = new List<ScopeClaim>
        {
            new ScopeClaim(Constants.ClaimTypes.Role),
            new ScopeClaim(Constants.ClaimTypes.Name),
        }
    };

客户:

        new Client
        {
            ClientName = "User area client",
            ClientId = "user_client",
            Enabled = true,

            AllowedScopes = new List<string>
            {
                "user_api", "offline_access"
            }
        },

        new Client
        {
            ClientName = "Admin area client",
            ClientId = "adm_client",
            Enabled = true,

            AllowedScopes = new List<string>
            {
                "user_api", "adm_api"
            }
        },

现在我想拒绝请求“adm_api”范围但没有 IsAdmin 声明的用户登录。我怎么做?我知道我可以向 API 添加自定义 Authorize 属性,我会这样做。但与等待第一次 API 访问相比,在登录时立即拒绝访问会更加用户友好。

【问题讨论】:

    标签: asp.net-web-api identityserver3 oauth2


    【解决方案1】:

    我认为在请求 api 资源之前检查已发布的声明并通知用户访问权限不足是您的管理员应用程序的责任。身份服务拒绝登录是不正确的,毕竟身份验证没有错。这听起来更像是授权。

    【讨论】:

    • 我想我最初误解了你的意图。我现在已经编辑了答案。希望有帮助
    • 我同意这听起来更像是授权。但另一方面,在登录时,用户要求访问范围,例如“读取”或“写入”或“admin_scope”。如果用户没有请求范围的权限,服务器应该怎么做?如果您说拒绝登录是错误的,那么服务器应该将不允许用户从令牌范围中排除,对吗?我该怎么做?
    • 不,用户不要求范围,应用程序要求。您的管理应用程序将 - 正如它应该的那样 - 要求管理范围,而身份服务将 - 它应该 - 对用户进行身份验证。但是,如果您的用户没有所需的声明,那就是授权,应该由您的管理应用通知用户。
    • 你的意思是根据用户的声明拒绝访问某个范围是错误的吗?
    • 不,我的意思是你混淆了两个概念。范围访问权授予您的应用程序 Oauth 客户端,而不是用户。显然,您的管理应用程序需要管理员范围访问权限,否则它将无法执行应有的操作。另一方面,经过身份验证的用户可能没有您的应用程序要求的声明,如果是这种情况,应用程序有责任在发出 API 请求之前显示“访问被拒绝”页面。
    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2014-03-27
    • 2021-11-24
    • 2011-01-06
    • 2012-06-20
    • 2014-06-14
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多