public void ConfigureServices(IServiceCollection services)
{
(...)
services.AddAuthorization(options =>
{
options.AddPolicy("Accounting", policy =>
policy.RequireClaim("member_of", "[accounting]")); //this claim value is an array. Any suggestions how to extract just single role? This still works.
});
}
我在ValuesController中编辑了get方法(默认Web API模板):
[Authorize(Policy = "Accounting")]
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public Dictionary<string,string> Get()
{
var userPrinciple = User as ClaimsPrincipal;
var claims = new Dictionary<string, string>();
foreach (var claim in userPrinciple.Claims)
{
var key = claim.Type;
var value = claim.Value;
claims.Add(key, value);
}
return claims;
}
5条答案
按热度按时间jutyujz01#
我今天玩了一点这个。最直接的方法就是使用OpenId标准。
在Startup.cs中,我使用了OpenIdConnect身份验证:
OpenIdConnectOptions方法:
在appsettings.json中添加Keycloak的配置:
Keycloak客户端配置如下:
如果我想按角色授权用户,我会这样做:
在ConfigureServices方法中添加authorization by claims:
我在ValuesController中编辑了get方法(默认Web API模板):
如果我使用具有会计角色的用户或具有会计角色的组中的用户登录,则应该在地址localhost:57630/API/values上显示我的用户声明。
我希望这对你有用。
编辑:.NET Core 2大家好!我的应用程序的工作方式改变了很多,我还没有完全测试.NET Core 2,但你仍然可以尝试在ConfigureServices中连接到Keycloak:
在Configure中:
您可以稍后使用IHttpContextAccessor httpContextAccessor访问令牌,例如:
//获取accessToken
告诉我进展如何。
58wvjzkj2#
如果你想使用标准的.Net角色Map与Keycloak客户端角色,设置如下:
Startup.cs:
appsettings.json:
Keycloak客户端设置:
现在,您可以使用标准的authorize role语句将Keycloak客户端角色应用于ASP.NET项目:
9rbhqvlz3#
对我们有用的是在Startup.cs中设置这些东西(它是基于cookie的身份验证):
设置选项:
3b6akqbq4#
我们能用.net core 5+得到这个问题的最新答案吗?我最近安装了keycloak版本13.0.0,它的工作允许我使用一对夫妇的应用程序单点登录。现在我安装keycloak的真实的原因是为了webapi身份验证。基于上面的答案,我已经安装了Microsoft.AspNetCore.Authentication.OpenIdConnect &一直在努力让它在webapi端和客户端都能工作。
j91ykkif5#
对于那些为.Net 6后端构建基于KeyCloak的身份验证并寻找基于JWT令牌的解决方案的人来说,这里有一段代码可以添加到Delobytes.AspNetCore.Infrastructure客户端的应用程序的ConfigureServices中: