.NET Core MVC在授权之前在开发中向本地用户添加角色声明

时间:2016-11-21 14:15:16

标签: c# asp.net-core-mvc .net-core claims-based-identity asp.net-authorization

我正在寻找一种“简单”的方法来自动向本地用户添加角色声明,以便测试我的授权逻辑;也就是说,在我的控制器授权之前,想要向本地用户添加一些特定声明。

我已经了解到,在过去,可以为控制器做类似于此的事情:

#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 {
    // ...

1 个答案:

答案 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()
});

当然,如果它是测试你将它包装在一个环境中检查,以确保你在你的开发环境中:)