从我的WebApi添加声明到身份

时间:2017-07-05 09:31:00

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

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

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

我面临的问题是理想情况下,在通过IdentityServer进行身份验证后,我希望Angular应用程序获取允许的列表 权限,并从那里他们发送到WebApi作为他们的声明的一部分。原因是我不想查询数据库 在每个Api Call上,如果我可以帮助它,看看特定用户是否有权访问特定的Controller动作。

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

1 个答案:

答案 0 :(得分:0)

您可以为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
    }