【问题标题】:Adding Claims to Identity from my WebApi从我的 WebApi 添加身份声明
【发布时间】:2017-12-08 21:21:01
【问题描述】:

我目前正在开发一个 Web 应用程序,其中包含一个与 IdentitServer4 和一个 WebApi dotnetcore 应用程序一起使用的 Angular4 UI。

我们拥有与 IDS 一起使用的应用程序身份验证机制,但我们现在希望根据用户授予的权限来限制 Angular 应用程序的某些部分。这些信息存储在我们的 WebApi 后面。如果不允许用户执行特定操作(即 EditUsers),这些权限也将用于保护我们的 WebApi 阻止用户执行特定操作。

我面临的问题是,理想情况下,在通过 IdentityServer 进行身份验证后,我希望 Angular 应用程序获取允许的列表 权限,然后他们将这些权限发送到 WebApi 作为其声明的一部分。这样做的原因是我不想查询数据库 如果我可以帮助它查看特定用户是否有权访问特定的控制器操作,请在每个 Api 调用上进行。

无论如何我可以设置这些声明,以便对 API 的后续调用包含这些声明,然后我可以从那里检查用户声明身份的声明信息 验证对资源的访问权限?

【问题讨论】:

    标签: asp.net-web-api asp.net-core authorization identityserver4


    【解决方案1】:

    例如,您可以将范围添加到您的 WebApi (official docs)

    app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
    {
        Authority = "https://demo.identityserver.io",
        ApiName = "api1",
    
        AllowedScopes = { "api1.read", "api1.write" }
    
        AutomaticAuthenticate = true,
        AutomaticChallenge = true
    });
    

    您可以将声明添加到客户端应用程序:

    var mvcClient = new Client
    {
        ClientId = "mvc",
        ClientName = "MVC Client",
        ClientUri = "http://identityserver.io",
    
        AllowedGrantTypes = GrantTypes.Hybrid,
        AllowOfflineAccess = true,
        ClientSecrets = { new Secret("secret".Sha256()) },
    
        RedirectUris =           { "http://localhost:5002/signin-oidc" },
        PostLogoutRedirectUris = { "http://localhost:5002/" },
        LogoutUri =                "http://localhost:5002/signout-oidc",
    
        AllowedScopes =
        {
            IdentityServerConstants.StandardScopes.OpenId,
            IdentityServerConstants.StandardScopes.Profile,
            IdentityServerConstants.StandardScopes.Email,
    
            "api1", "api2.read"
        },
    };
    

    这是应用程序基础,为了为每个用户分配权限,您可以在您的范围内为用户定义角色,然后可以使用该角色装饰您的控制器或方法,例如:

    For admin: new Claim("role","Admin")
    For guestuser: new Claim("role","guest")
    
    
    [HttpGet]
        [Authorize(Roles = "Admin")]
        public IActionResult Edit()
        {
            //whatever
        }
    
        [Authorize(Roles = "Guest")]
        [HttpGet]
        public IActionResult View()
        {
            //whatever
        }
    

    【讨论】:

    • 非常感谢,但权限将存储在我的 WebApi 项目中,而不是我的身份服务器中。因此,一个人可能有权访问用户控制器和空间控制器,但这是在 webApi 中管理的
    猜你喜欢
    • 2017-01-04
    • 2022-01-22
    • 2021-06-30
    • 2018-01-28
    • 2014-02-20
    • 2018-07-04
    • 2022-01-20
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多