如何在控制器操作上创建属性以检查用户是否有声明

问题描述 投票:0回答:2

我已经向用户添加了一些自定义声明,我想知道是否要使用属性检查这些声明是否存在于控制器操作中,我知道我们可以从.Net创建一个类并扩展属性,因此总体思路是来检查用户是否有要求,我在实现上还不清楚。

也许像这样:

[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)]
public class ClaimRequirementAttribute : Attribute
{
    public ClaimRequirementAttribute(string claimType)
    {
        new Claim(claimType, null);
    }
}
public class ClaimRequirementFilter
{
    public void OnAuthorization(HttpContext httpContext)
    {
        var hasClaim = httpContext.User.HasClaim(x => x.Type == 
        CapabilityClaims.CanReadSpore);

        if (!hasClaim)
        {

        }
    }
}
asp.net-core claims
2个回答
2
投票
您可以使用ClaimsGetClaimsAsync方法获得特定用户的UserManager

您可以使用以下方法:

public class TestController : Controller { private readonly UserManager<AppUser> _userManager; public TestController(UserManager<AppUser> userManager) { _userManager = userManager; } public CheckIfClaimsExist(string email) { var user = await _userManager.FindByEmailAsync(email); if(user != null) { var claims = await _userManager.GetClaimsAsync(user); } } }

注意: AppUser类是自定义类,它从身份服务器扩展了IdentityUser类。


0
投票
经过一些长期的研究,我找到了这个答案using filters最终成为最好的方法

[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)] public class ClaimRequirementAttribute : TypeFilterAttribute { public ClaimRequirementAttribute(params string[] claimType) : base(typeof(ClaimRequirementFilter)) { Arguments = new object[] { claimType }; } } public class ClaimRequirementFilter : IAuthorizationFilter { readonly string[] _claimTypes; public ClaimRequirementFilter(string[] claimTypes) { _claimTypes = claimTypes; } public void OnAuthorization(AuthorizationFilterContext authContext) { if (authContext == null) { throw new ArgumentNullException(nameof(authContext)); } var user = authContext.HttpContext.User; var resourceId = authContext.RouteData.Values["id"].ToString(); var claimType = _claimTypes .All(s => (user.Claims) .Any(c => c.Type == s && (c.Value == resourceId || c.Value == string.Empty))); if (user == null || !claimType) { authContext.Result = new ForbidResult(); } }

© www.soinside.com 2019 - 2024. All rights reserved.