角色/用户的ASP.NET MVC黑名单

约翰尼·罗斯

问题摘要:在ASP.NET MVC中,是否存在防止特定用户或角色访问操作的干净方法?

显然,以下内容将允许角色AdminEditor访问整个控制器。

[Authorize(Roles = "Admin, Editor")]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

如果我只希望Admin角色有权访问该About动作,则可以执行以下操作:

[Authorize(Roles = "Admin, Editor")]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [Authorize(Roles = "Admin")] // this will take precedence over the controller's authorization
    public ActionResult About()
    {
        return View();
    }
}

有没有一种方法可以做到这一点而无需列出需要访问的每个角色,而仅指定应该阻止其访问的角色

约翰尼·罗斯

这是我用来解决此问题的类的代码。它主要源于AuthorizeAttribute,并将允许任何经过身份验证的用户通过与参数设置的规范匹配的用户

(请注意,重要的方法是AuthorizeCore-其他所有内容基本上都是从复制或继承的AuthorizeAttribute

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class BlackListAttribute : AuthorizeAttribute
{
    private static readonly string[] _emptyArray = new string[0];

    private string _roles;
    private string _users;

    private string[] _rolesSplit = _emptyArray;
    private string[] _usersSplit = _emptyArray;

    public new string Roles
    {
        get { return _roles ?? String.Empty; }
        set
        {
            _roles = value;
            _rolesSplit = SplitString(value);
        }
    }

    public new string Users
    {
        get { return _users ?? String.Empty; }
        set
        {
            _users = value;
            _usersSplit = SplitString(value);
        }
    }
    // This is the important part. Everything else is either inherited from AuthorizeAttribute or, in the case of private or internal members, copied from AuthorizeAttribute.
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException("httpContext");
        }

        IPrincipal user = httpContext.User;

        if (user == null || user.Identity == null || !user.Identity.IsAuthenticated)
        {
            return false;
        }

        if (_usersSplit.Length > 0 && _usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase))
        {
            return false;
        }

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

        return true;
    }

    internal static string[] SplitString(string original)
    {
        if (String.IsNullOrEmpty(original))
        {
            return _emptyArray;
        }

        var split = from piece in original.Split(',')
                    let trimmed = piece.Trim()
                    where !String.IsNullOrEmpty(trimmed)
                    select trimmed;
        return split.ToArray();
    }
}

您可以在控制器或其他任何操作上使用它AuthorizeAttribute

[Authorize(Roles = "Admin, Editor")]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
    [BlackList(Roles = "Editor")]
    public ActionResult About()
    {
        return View();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ASP.NET(MVC)用户,角色和角色中的用户

来自分类Dev

ASP.NET(MVC)用户,角色和角色中的用户

来自分类Dev

防止基于Rails中的黑名单进行用户注册

来自分类Dev

防止基于Rails中的黑名单的用户注册

来自分类Dev

ASP.NET MVC或者基于用户角色的渲染EditorFor

来自分类Dev

ASP.NET MVC授权具有多个角色的用户

来自分类Dev

具有MVC Asp.net身份角色的用户列表

来自分类Dev

ASP.Net MVC 5检查用户角色的_Layout

来自分类Dev

如何在discord.py中将用户列入黑名单和白名单?

来自分类Dev

ASP.net MVC + ASP.net身份播种角色和用户

来自分类Dev

如何在黑名单中获取用户(重复)discord.js

来自分类Dev

用户名作为带有黑名单验证的参数

来自分类Dev

如何在ASP.NET MVC Web API中创建角色并将用户添加到角色

来自分类Dev

StackExchange黑名单

来自分类Dev

检查用户是否在asp.net mvc Identity中扮演角色

来自分类Dev

如何添加简单的用户角色-ASP.NET MVC C#

来自分类Dev

如何在ASP.NET MVC 5中列出具有角色名称的用户

来自分类Dev

基于用户角色的ASP.NET MVC 5 Identity 2登录重定向

来自分类Dev

如何在ASP.NET MVC中将用户角色传递为ViewModel?

来自分类Dev

基于ASP.NET MVC中角色的自定义用户授权

来自分类Dev

获取ASP.NET Core MVC中当前登录用户的角色

来自分类Dev

根据用户角色呈现不同的视图ASP.NET MVC 5

来自分类Dev

ASP.NET MVC 5基于用户角色自定义Bootstrap导航栏

来自分类Dev

ASP.NET MVC 5 Identity 2.0,Windows Auth,具有角色属性的用户模型

来自分类Dev

在ASP.NET MVC和Azure AD中创建自定义用户角色

来自分类Dev

ASP.net MVC获取用户从URL检索的特定ID的角色

来自分类Dev

将所有用户及其角色放入表asp.net mvc

来自分类Dev

尝试为Asp.Net mvc 5中的用户和角色播种数据时出错

来自分类Dev

获取登录用户角色:Asp.net MVC5

Related 相关文章

  1. 1

    ASP.NET(MVC)用户,角色和角色中的用户

  2. 2

    ASP.NET(MVC)用户,角色和角色中的用户

  3. 3

    防止基于Rails中的黑名单进行用户注册

  4. 4

    防止基于Rails中的黑名单的用户注册

  5. 5

    ASP.NET MVC或者基于用户角色的渲染EditorFor

  6. 6

    ASP.NET MVC授权具有多个角色的用户

  7. 7

    具有MVC Asp.net身份角色的用户列表

  8. 8

    ASP.Net MVC 5检查用户角色的_Layout

  9. 9

    如何在discord.py中将用户列入黑名单和白名单?

  10. 10

    ASP.net MVC + ASP.net身份播种角色和用户

  11. 11

    如何在黑名单中获取用户(重复)discord.js

  12. 12

    用户名作为带有黑名单验证的参数

  13. 13

    如何在ASP.NET MVC Web API中创建角色并将用户添加到角色

  14. 14

    StackExchange黑名单

  15. 15

    检查用户是否在asp.net mvc Identity中扮演角色

  16. 16

    如何添加简单的用户角色-ASP.NET MVC C#

  17. 17

    如何在ASP.NET MVC 5中列出具有角色名称的用户

  18. 18

    基于用户角色的ASP.NET MVC 5 Identity 2登录重定向

  19. 19

    如何在ASP.NET MVC中将用户角色传递为ViewModel?

  20. 20

    基于ASP.NET MVC中角色的自定义用户授权

  21. 21

    获取ASP.NET Core MVC中当前登录用户的角色

  22. 22

    根据用户角色呈现不同的视图ASP.NET MVC 5

  23. 23

    ASP.NET MVC 5基于用户角色自定义Bootstrap导航栏

  24. 24

    ASP.NET MVC 5 Identity 2.0,Windows Auth,具有角色属性的用户模型

  25. 25

    在ASP.NET MVC和Azure AD中创建自定义用户角色

  26. 26

    ASP.net MVC获取用户从URL检索的特定ID的角色

  27. 27

    将所有用户及其角色放入表asp.net mvc

  28. 28

    尝试为Asp.Net mvc 5中的用户和角色播种数据时出错

  29. 29

    获取登录用户角色:Asp.net MVC5

热门标签

归档