我正在使用
If(User.IsInRole("member"))
{
}
但无法在C#MVC类中使用它。请注意,我没有在我能够工作的控制器中使用它。我错过了什么?代码甚至无法识别用户是什么。
我认为它可能是命名空间,但我使用了.Mvc
命名空间以及其他...
提前谢谢
答案 0 :(得分:7)
使用HttpContext.Current.User
代替
答案 1 :(得分:4)
这是一种方法(它在耦合方面是正确的,但它违反了单一责任原则):
if (Roles.IsUserInRole("member"))
{
}
基本上,您使用的是Roles.IsUserInRole
静态方法,而后者又使用您在web.config的<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控制器,它可以查询角色提供程序,如我的第一个示例所示,并将其传递给基础类
如果此类有更多方法而其他方法不需要此信息,您也可以将boolean参数作为参数传递给方法,而不是使用构造函数注入。
答案 2 :(得分:0)
使用此System.Web.HttpContext.Current.User.IsInRole("yourRole")