我正在开发一个项目,用户可以登录并创建任意数量的“工作项目”,这些项目与他们的帐户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是“错误的”吗?我曾经在其他会话状态滥用的项目上被烧得非常糟糕(阅读:太多的数据被序列化为会话状态)使网络服务器瘫痪到期。如果有同样简单的方法,我宁愿避免它。
由于
答案 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框架中的扩展方法