【发布时间】:2016-01-02 01:58:47
【问题描述】:
我正在处理一个场景,我使用 ActionFilterAttribute 检查记录所有权,这种方式需要我传递操作正在处理的模型类型以及 id 参数,如下所示:
[CheckOwnership(objectId = "clientid", Model = typeof(Client))]
然后运行检查以查看用户的 companyId 是否与记录的 companyId 匹配,如下所示:
public class CheckOwnership : ActionFilterAttribute
{
public string objectId { get; set; }
public object Model { get; set; }
private MyDatabaseContext db = new MyDatabaseContext();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionParameters.ContainsKey(objectId))
{
var id = filterContext.ActionParameters[objectId] as Int32?;
var model = Model;
if (model.GetType() == typeof(Client))
{
var companyId = SharedLogic.GetCurrentCompanyId();
var clientCompanyId = db.Clients.Find(id).CompanyId;
if (companyId != clientCompanyId)
{
// deauthorize user
}
}
}
}
}
问题在于如果用户不以与[Authorize] 属性相同的方式拥有该记录,则通过将用户返回到登录页面来“取消授权”用户。
我知道如何做到这一点的唯一方法是构建一个自定义AuthorizeAttribute,但这不允许我访问在用户发出请求时传递给方法的 id 参数。通过使用ActionFilterAttribute,我可以访问 ActionExecutingContext,我可以使用它来检索参数等。
有没有办法在不使用授权属性的情况下取消对用户的授权并将其返回到登录页面?
【问题讨论】:
标签: c# asp.net-mvc authorization custom-attributes action-filter