我正在寻找一种“简单”的方法来自动向本地用户添加角色声明,以便测试我的授权逻辑;也就是说,在我的控制器授权之前,想要向本地用户添加一些特定声明。
我已经了解到,在过去,可以为控制器做类似于此的事情:
#if DEBUG
protected override void OnAuthorization(AuthorizationContext filterContext)
{
var roles = new[] { "role-under-test"};
HttpContext.User = new GenericPrincipal(new GenericIdentity("DebugUser"), roles);
base.OnAuthorization(filterContext);
}
#endif
然而,那是在.NET Core之前,这是我现在正在做的工作。慢慢地,我已经按照下面给出的代码工作,这似乎有效,但与上面的例子相比显然更麻烦。所以我的问题是,是否有人知道更好 - 更容易实现这一目标的方法?
自定义授权属性:
public class CustomAuthAttribute : RolesAuthorizationRequirement {
public CustomAuthAttribute(IEnumerable<string> allowedRoles) : base(allowedRoles) { }
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesAuthorizationRequirement requirement) {
#if DEBUG
context.User.AddIdentity(new ClaimsIdentity(new GenericIdentity("DebugUser"), new[] {
new Claim(ClaimsIdentity.DefaultRoleClaimType, "users"),
new Claim(ClaimsIdentity.DefaultRoleClaimType, "admins")
}));
#endif
return base.HandleRequirementAsync(context, requirement);
}
}
在Startup.cs
中public void ConfigureServices(IServiceCollection services) {
// ...
services.AddAuthorization( options =>
options.AddPolicy("UsersAndAdmins",
policy => policy.AddRequirements(new CustomAuthAttribute(new []{"users", "admins"}))));
}
然后在控制器中使用它:
[Authorize(Policy = "UsersAndAdmins")]
public class HomeController : Controller {
// ...
答案 0 :(得分:1)
您希望声明转换;
编写看起来像
的声明转换public class ClaimsTransformer : IClaimsTransformer
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
{
((ClaimsIdentity)context.principal.Identity).AddClaim(new Claim("Admin", "true"));
return Task.FromResult(principal);
}
}
并在Configure
startup.cs
内进行连线
app.UseClaimsTransformation(new ClaimsTransformationOptions
{
Transformer = new ClaimsTransformer()
});
当然,如果它是测试你将它包装在一个环境中检查,以确保你在你的开发环境中:)