【问题标题】:ASP.NET MVC - user authorize in controllerASP.NET MVC - 用户在控制器中授权
【发布时间】:2014-05-28 03:16:03
【问题描述】:

我的数据库中有包含用户名的表(带有域,例如:Domain1\user1)。我的项目有 Windows 身份验证。我有两个控制器 - 一个用于所有登录用户,第二个用于特定用户。我的表有 3 列:(Id、Name、Extra),其中“Extra”仅填充用户,即管理员(它有 varchar:“admin”)。
我想创建这样的授权,只有管理员才能使用第二个控制器访问站点。怎么写?

如有任何建议,我将不胜感激。
提前感谢您的帮助。 ;)
莫尼克

====编辑====
例如:ASP.NET MVC 4 Custom Authorize Attribute with Permission Codes (without roles)

在我的主控制器中:

[AuthorizeUser(AccessLevel = "Extra")]  
public class SecureController : Controller
{
      (...) 
}



public class AuthorizeUserAttribute : AuthorizeAttribute
{
    public string AccessLevel { get; set; }
    private Report_DBEnt REn = new Report_DBEnt(); 

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {
            return false;
        }


        string privilegeLevels = string.Join("", REn.Users.Where(u => u.Extra.Equals("admin")).FirstOrDefault()); 

        if (privilegeLevels.Contains(this.AccessLevel))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

我试过像这样使用它,但我无法访问我的网站。

【问题讨论】:

  • 您必须创建自己的过滤器。 stackoverflow.com/questions/13264496/…
  • 我知道这一点。但是我想使用在 Extra 列中搜索特定行来查找管理员用户 - 我不知道如何实现这一点......您提供的示例中的 AccessLevel 是什么?
  • 您可以将AccesLevel 替换为Extra
  • 好的,那么我应该如何编写方法来从我的数据库中获取我想要的东西?我看到我必须更改此行:string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); 但如何更改?当我想在它之前使用时:private Reports_DBEnt REn = new Reports_DBEnt(); 然后string privilegeLevels = string.Join("", REn.Users....); 它不起作用。
  • FilterConfig.cs 文件中,您应该添加自定义授权属性filters.Add(new AuthorizeUserAttribute());

标签: entity-framework asp.net-mvc-4 authorization


【解决方案1】:

试试这个:

[AuthorizeUser(AccessLevel = "admin")]  
public class SecureController : Controller
{
  (...) 
}

希望对你有帮助

更新

  public class AuthorizeUserAttribute : AuthorizeAttribute
  {
    public string AccessLevel { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
      if(httpContext.User.Identity.IsAuthenticated)
       {
         string privilegeLevels = string.Join("",GetUserRights(httpContext.User.Identity.Name.ToString()); 

         if (privilegeLevels.Contains(this.AccessLevel))
          {
           return true;
           }
         else
           {
           return false;
           }
       }
     else
     return false;

    }
}

   private string GetUserRights(string userName)
   {
     private Report_DBEnt REn = new Report_DBEnt();
     return REn.Users.Where(u => u.UserName== userName).Select(u=>u.Extra);
   }

【讨论】:

  • 这还不是全部。我想我有privilegeLevels 不好。我应该以某种方式使用httpContext.User.Identity.Name.ToString(),不是吗?我试过string.Join("", REn.Users.Where(u => u.Name == httpContext.User.Identity.Name));,但我仍然无法访问。
  • 尝试在过滤器中放置一个断点,看看过滤器内部会发生什么。
  • 我补充说:var user = httpContext.User.Identity.Name; var user2 = REn.Users.Where(u => u.Name == user).FirstOrDefault(); 他们是正确的。但是字符串privilegeLevels 格式错误,因为返回null。
  • 您的httpContext.User.Identity.Namenull 不同吗?
  • 是的,它不为空。现在一切正常。 :D 我忘了我必须使用Select(u=>u.Extra)。非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多