在ASP.NET MVC中调用控制器方法时验证用户权限

时间:2014-10-09 05:29:18

标签: c# asp.net asp.net-mvc security asp.net-identity-2

我正在开发一个项目,用户可以登录并创建任意数量的“工作项目”,这些项目与他们的帐户ID相关联。我们正在使用OWIN和ASP.NET Identity 2.1。

响应HTTP POST请求的所有MVC控制器操作都需要将WorkProjectId作为HTTP标头传入。登录用户应该只能与与其登录相关联的WorkProject进行交互。这提出了一个重要的安全考虑因素:最佳做法是在调用控制器操作时询问与当前登录用户关联的WorkProjectId,可能是通过使用自定义属性?

E.g。

[EnsureUserIsAllowedToDoAnythingToThisWPID]
public async Task UpdateWorkProjectTitle(ViewModel vm) {
 ...
}

因为用户可以根据自己的需要创建尽可能多的WorkProjects,所以我认为我不能使用基于声明的安全性。据我了解,如果WorkProjectIds以某种方式存储为声明,如果它们被修改,则必须在发生这种情况时将用户登录进出...这显然是不可接受的。

因此,要实现我所需要的,存储登录用户在会话状态下可以访问的ID是“错误的”吗?我曾经在其他会话状态滥用的项目上被烧得非常糟糕(阅读:太多的数据被序列化为会话状态)使网络服务器瘫痪到期。如果有同样简单的方法,我宁愿避免它。

由于

1 个答案:

答案 0 :(得分:1)

为什么不直接为当前用户添加/删除声明?在控制器端通过UserManager.AddClaim粘贴登录用户ID和所需的Claim对象(即workProject的id?)。据我所知,将用户数据(即允许WorkProjectIds)存储在cookie中是可取的。您的自定义授权属性将检查当前用户是否允许WorkProject

[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method,
    Inherited = true, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    private string _url; // path to action, also you can get it from request
    private Operations _operation; // user requested action (CRUD? or administer, execute, etc.)

    // example of usage as attribute [CustomAuthAttrib("some string", Operations.Create)]
    public CustomAuthorizeAttribute(string url, Operations operation)
    {
        _url = url;
        _operation = operation;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // any httpContext.Request... operations
        return base.AuthorizeCore(httpContext);
    }
}

这是我的一些原始列表,目前我面临着一些类似的问题。并且,要访问声明,可能需要一些OWIN / Katana和/或ASP.NET Identity框架中的扩展方法