Pri*_*mar 5 windows-authentication .net-core
我有一个启用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 Core 2.1.3
Ace*_*s25 10
在 .NET Core 2+ 中,IClaimsTransformer 已被弃用。而是使用 IClaimsTransformation:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您不应使用“ClaimTypes.Role”。您应该使用 ci.RoleClaimType - 特别是如果您启用了 Windows 身份验证。在 Windows 身份验证下,ci.RoleClaimType 评估为一些字符串值,该值将作为角色正确获取,而 ClaimTypes.Role 不会。
最后通过将 ClaimsTransformer 添加到 Startup.cs 的 ConfigureServices 方法来注入它:
services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();
Run Code Online (Sandbox Code Playgroud)
您现在应该能够将基于角色的授权属性添加到您的控制器方法中,并且现在将正确评估这些属性:
[Authorize(Roles = "Admin")]
[HttpGet("[action]/{id}")]
public User GetUser([FromRoute] int id)
{
UserLogic ul = new UserLogic();
return ul.GetUser(id);
}
Run Code Online (Sandbox Code Playgroud)
您可以在类中向 windows 用户添加 Claims ClaimsTransformer。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
并将此行添加到启动中:
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();
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅: 向 Windows 身份添加声明。
| 归档时间: |
|
| 查看次数: |
984 次 |
| 最近记录: |