(任何人都可以帮助我获得这个问题的最佳头衔吗?我试着思考......但我没有取得任何成功,而不是那个。)
让我解释下面的情况和怀疑。
我正在创建一个网站,可以管理每个用户的很多项目。每个用户只能是所有者或参与者。
我有记录用户的公共区域,项目中所有用户都可以访问的区域,以及只有所有者才能访问的区域。
我为控制器和操作创建了OwnerAuthorize属性和SimpleAuthorize属性:
public class OwnerAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var projectId = int.Parse(httpContext.Request.Params.Get("projectId"));
var userId = httpContext.User.Identity.GetUserId<int>();
project currentProject = null;
using (var projectService = new ProjectsService())
{
currentProject = projectService.Find(projectId).Result;
}
if (currentProject == null)
{
return false;
}
else
{
if (currentProject.OwnerId == userId)
{
return true;
}
else
{
return false;
}
}
}
}
public class SimpleAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var projectId = int.Parse(httpContext.Request.Params.Get("projectId"));
var userId = httpContext.User.Identity.GetUserId<int>();
Project currentProject = null;
using (var projectService = new ProjectsService())
{
currentProject = projectService.Find(projectId).Result;
}
if (currentProject == null)
{
return false;
}
else
{
if (currentProject.OwnerId == userId
|| currentProject.Users.Select(u => u.Id).Contains(userId))
{
return true;
}
else
{
return false;
}
}
}
}
对于少数用户来说,没关系。但是对于许多用户来说,我有一个数据库查询来为每个被调用的动作收集相同的信息。所以,我正在考虑使用会话来保存当前用户和项目访问的一些信息。
使用此方案的最佳方式/实践是什么?