我目前正在开发一个Web应用程序,其中包含使用IdentitServer4和WebApi dotnetcore应用程序的Angular4 UI。
我们有使用IDS的应用程序身份验证机制,但我们现在希望根据用户授予他们的权限来限制Angular应用程序的部分内容。此信息存储在我们的WebApi后面。这些权限还可用于保护我们的WebApi不会阻止用户执行特定操作(如果不允许),即EditUsers。
我面临的问题是理想情况下,在通过IdentityServer进行身份验证后,我希望Angular应用程序获取允许的列表 权限,并从那里他们发送到WebApi作为他们的声明的一部分。原因是我不想查询数据库 在每个Api Call上,如果我可以帮助它,看看特定用户是否有权访问特定的Controller动作。
无论如何,我可以设置这些声明,以便后续调用API包含这些声明,然后我可以检查用户声明身份中的声明信息 验证对资源的访问权限?
答案 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
}