我有一个启用了Windows应用程序的dotnet核心api应用程序。我们有很多用户拥有特殊权限'admin'并存储在数据库中,其余都有默认权限'user'。我希望用户有额外的声明,他们都在数据库中。此外,我想存储更多信息,如emailid,员工编号(我必须手动从LDAP查询)
我想的是我会有一个api,比如api/auth
,它将捕获当前用户并根据数据库和ldap查询添加声明,其他api端点可以使用它。
但我无法获得如何在不同的api端点之间添加和保留声明。
是否可能,或者它是一种好方法? 我有第二个选项来在每次api调用时点击数据库。
编辑1:
我编写了一个中间件来拦截所有api请求并搜索LDAP /数据库,创建ClaimsIndentity
并将其添加到Users.Identity
。然后通过剩余的通话即可使用。
编辑2:
当我是@Ondra Starenko的回答时,我无法引用IClaimsTransformer
或app.UseClaimsTransformation
。还有其他我需要包括的内容。
平台:.NET核心2.1.3
答案 0 :(得分:3)
您可以在ClaimsTransformer
类中向Windows用户添加Claims。
public class ClaimsTransformer : IClaimsTransformer
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
{
//add new claim
var ci = (ClaimsIdentity) context.Principal.Identity;
var c = new Claim(ClaimTypes.Role, "admin");
ci.AddClaim(c);
return Task.FromResult(context.Principal);
}
}
并将此行添加到“启动”:
app.UseClaimsTransformation(o => new ClaimsTransformer().TransformAsync(o));
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(LogLevel.Debug);
loggerFactory.AddDebug();
app.UseClaimsTransformation(o => new ClaimsTransformer().TransformAsync(o));
app.UseStaticFiles();
app.UseMvc();
}
有关更多信息,请参见: add claims to windows identity。
答案 1 :(得分:2)
在.NET Core 2+中,IClaimsTransformer已被弃用。而是使用IClaimsTransformation:
''
还请注意,您不应使用“ ClaimTypes.Role”。您应该使用ci.RoleClaimType-特别是如果您启用了Windows身份验证。在Windows身份验证下,ci.RoleClaimType评估为某个字符串值,该字符串值将作为角色正确获取,而ClaimTypes.Role则不会。
最后将您的ClaimsTransformer添加到Startup.cs的ConfigureServices方法中:
read_excel
您现在应该能够将基于角色的授权属性添加到Controller方法中,并且这些属性现在将被正确评估:
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
public class ClaimsTransformer : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var ci = (ClaimsIdentity) principal.Identity;
var c = new Claim(ci.RoleClaimType, "Admin");
ci.AddClaim(c);
return Task.FromResult(principal);
}
}