User.IsInRole()在MVC C#类中工作

时间:2013-01-10 13:29:40

标签: c# asp.net-mvc

我正在使用

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

}

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

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

提前谢谢

3 个答案:

答案 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")