asp.net mvc - User.IsInRole()在mvc c#类中工作

本文关键字:mvc 工作 net User IsInRole asp | 更新日期: 2023-09-27 17:51:10

我使用

If(User.IsInRole("member"))
{
}

但不能让它在c# MVC类中工作。请注意,我没有在我能够工作的控制器中使用它。我错过了什么?代码甚至不能识别User是什么

我认为它可能是一个命名空间,但我已经使用了.Mvc命名空间以及其他…

提前感谢

asp.net mvc - User.IsInRole()在mvc c#类中工作

HttpContext.Current.User代替

有一种方法可以做到这一点(它在耦合方面是正确的,但它违反了单一责任原则):

if (Roles.IsUserInRole("member"))
{
}

基本上在这里你使用的是Roles.IsUserInRole静态方法,而这反过来又使用了你在web的<roles>部分配置的角色提供程序。配置获取当前认证用户的角色。

但这不是我建议你采用的方法。像角色和会员提供者这样的东西应该是特定于你的Web层的。您的业务类不应该费心检索这些信息。这个信息应该作为参数传递给他们。

例如,如果该类的所有方法都需要此信息,则可以简单地使用构造函数注入:
public class MyClass
{
    private readonly bool _isCurrentUserAMember;
    public MyClass(bool isCurrentUserAMember)
    {
        _isCurrentUserAMember = isCurrentUserAMember;
    }
    public void SomeMethod()
    {
        if (_isCurrentUserAMember)
        {
            // do some business logic for members
        }
        else
        {
            // do some other business logic for non-members
        }
    }
}

正如你在这里看到的,这个类关心的是当前用户是否是一个成员,以便执行他的业务逻辑,对吗?这个类并不关心如何获取这些信息。这不是它的责任,如果你开始从类中获取它,你就违反了单一责任原则,这是非常重要的,因为现在你的类正在做两件事:检索角色信息和执行业务逻辑。

使用我推荐的方法,我们将此责任倒置到调用代码,通常在这种情况下恰好是MVC控制器,它可以查询角色提供者,如我的第一个示例所示,并将其传递给底层类。

如果这个类有更多的方法,而其他方法不需要这些信息,你也可以将布尔形参作为参数传递给方法,而不是使用构造函数注入。

使用System.Web.HttpContext.Current.User.IsInRole("yourRole")