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
命名空间以及其他…
提前感谢
用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")