我刚创建了一个自定义授权方法,以便我正在建立的网站上的用户只能看到他/她的观点。
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方法。
谢谢和问候
答案 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
参数可让您访问请求详细信息,其中可能包含用户名查询字符串的一部分。