【问题标题】:Authorize attribute for any roles任何角色的授权属性
【发布时间】:2013-12-03 00:15:16
【问题描述】:

假设我有 WebApi 控制器

[Authorize]
public class SomeApiController : ApiController

控制器操作方法本身没有任何[Authorize][AllowAnonymous] 属性。

如果用户没有角色,我希望 Authorize 属性返回 401(未授权)错误 - 看起来合乎逻辑(如果用户有角色但现在没有任何角色 - 即使用户经过身份验证,也不应该允许他执行操作) .我查看了 asp.net mvc webstack 我在 Authorize 属性中找到了以下代码:

if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole))
{
    return false;
}

所以看起来如果我们没有传递角色授权属性只是检查用户是否经过身份验证。在角色列表中设置每个角色对我来说不是一个选项(我的意思是[Authorize(Roles="role1,role2,...")])。

因此问题 - 我可以以某种方式实现设置 Authorize 属性以检查用户是否具有任何角色。还是写继承自上面的自定义属性更好?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api authorization


    【解决方案1】:

    创建如下自定义属性:

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        string[] userRoles = System.Web.Security.Roles.GetRolesForUser(filterContext.HttpContext.User.Identity.Name);
    
        if (!userRoles.Any())
        {
            throw new HttpException(401, "Unauthorized");
        }
        base.HandleUnauthorizedRequest(filterContext);
    }
    

    }

    希望对你有帮助

    【讨论】:

    • 我知道如何创建自定义属性。问题是没有实现自定义属性的任何常识解决方案。此外,您的属性不适合我的需要 - 我想检查用户是否有任何角色。所以在这种情况下我需要注入角色提供者......但这是另一个话题
    • 如果不为您的案例实施自定义属性,我看不到任何常识性解决方案,但如果有解决方案,我会很高兴看到它。如果我提供的源代码不能满足您的需求,对不起,它只是让您了解如何解决您的问题。我又更新了,希望这次能给你更好的解决问题的思路。
    • 你为什么要调用 base.HandleUnauthorizedRequest(filtercontext); ?你应该调用 base.OnAuthorization(filtercontext);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多