Asp.net web api IdentityServer3:基于用户声明拒绝对给定范围的访问

Asp.net web api IdentityServer3:基于用户声明拒绝对给定范围的访问,asp.net-web-api,identityserver3,oauth2,Asp.net Web Api,Identityserver3,Oauth2,我有一个WebAPI,有两个区域-用户和管理员。2个站点,用户和管理员,使用它,他们有自己的客户端ID public static readonly Scope AdminScope = new Scope { Name = "adm_api", Type = ScopeType.Resource, Claims = new List<ScopeClaim> { new Scope

我有一个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),
        }
    };
公共静态只读范围AdminScope=新范围 { Name=“adm_api”, Type=ScopeType.Resource, 索赔=新名单 { 新的ScopeClaim(常量.索赔类型.角色), 新ScopeClaim(VitClaimTypes.IsAdmin) }, }; 公共静态只读范围UserScope=新范围 { Name=“user\u api”, Type=ScopeType.Resource, 索赔=新名单 { 新的ScopeClaim(常量.索赔类型.角色), 新的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"
            }
        },
新客户端
{
ClientName=“用户区域客户端”,
ClientId=“用户\客户端”,
启用=真,
AllowedScopes=新列表
{
“用户\u api”、“脱机\u访问”
}
},
新客户
{
ClientName=“管理区域客户端”,
ClientId=“adm_client”,
启用=真,
AllowedScopes=新列表
{
“用户api”、“管理api”
}
},

现在,我想拒绝请求“adm_api”作用域但没有IsAdmin声明的用户登录。我该怎么做?我知道我可以向API添加自定义授权属性,我会这样做。但是在登录时立即拒绝访问比等待第一次API访问更方便。

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

我想我最初误解了你的意图。我现在编辑了答案。希望我同意这听起来更像授权。但另一方面,在登录时,用户要求访问范围,如“读取”或“写入”或“管理范围”。如果用户对请求的作用域没有权限,服务器应该怎么做?如果您说拒绝登录是错误的,那么服务器应该将不允许用户登录的令牌范围排除在外,对吗?我该怎么做?不,用户不需要范围,应用程序需要。您的管理应用程序将-它应该-要求管理范围,身份服务将-它应该-验证用户。但是如果你的用户没有所需的声明,那么这就是授权,应该由你的管理应用程序通知用户。你的意思是基于用户的声明拒绝访问某个范围是错误的吗?不,我的意思是你混淆了两个概念。范围访问权授予应用程序Oauth客户端,而不是用户。显然,您的管理应用程序需要管理范围访问权限,否则它将无法执行它应该执行的操作。另一方面,经过身份验证的用户可能没有您的应用程序所要求的声明,在发出API请求之前,应用程序有责任显示“拒绝访问”页面。