将字符串传递给Custom Authorize MVC

时间:2015-12-31 11:30:03

标签: asp.net-mvc asp.net-mvc-5


我刚创建了一个自定义授权方法,以便我正在建立的网站上的用户只能看到他/她的观点。

public class UserAuthorize : AuthorizeAttribute
{
    public string Username { get; set; }

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

        string username = httpContext.User.Identity.Name;

        if(new RolesBL().IsUserInRole(username, 1))//1 is Admin
        {
            return true;
        }

        return Username.Equals(username);
    }
}

我无法将控制器中的数据传递给此方法

[UserAuthorize(Username = username)]
public ActionResult Details(string username)
{
    User u = new UsersBL().GetUser(username);
    return View(u);
}

如何将View的参数中的用户名也传递给Authorize方法。
谢谢和问候

2 个答案:

答案 0 :(得分:1)

这不是使用授权有意义的情况。相反,您应该阻止用户传入参数来覆盖他们登录的用户。

public ActionResult Details()
{
    User u = new UsersBL().GetUser(this.User.Identity.Name);
    return View(u);
}

您的查询将充当过滤器,以确保只能看到登录用户的信息。

如果您需要超级用户才能查看/编辑每个用户,则需要使用角色来确保只有该角色的用户才能编辑其他用户。但在这种情况下,标准AuthorizeAttribute就足够了。

public ActionResult Details()
{
    User u = new UsersBL().GetUser(this.User.Identity.Name);
    return View(u);
}

[Authorize(Roles = "SuperUser")]
public ActionResult Details(string username)
{
    User u = new UsersBL().GetUser(username);
    return View(u);
}

答案 1 :(得分:0)

[Attribute]声明中的参数都是在编译时定义的,因此必须是常量。您无法“传入”操作参数的运行时值。

除此之外,该属性将在调用操作方法之前使用(以确定是否可以调用动作) - 并且甚至不会实例化该参数。

但是,您可以访问username属性实现中的UserAuthorize值,因为httpContext参数可让您访问请求详细信息,其中可能包含用户名查询字符串的一部分。