在这种情况下,哪种方法/实践最好?我要使用会话吗?

时间:2016-08-31 12:43:56

标签: c# asp.net-mvc session authorization

(任何人都可以帮助我获得这个问题的最佳头衔吗?我试着思考......但我没有取得任何成功,而不是那个。)

让我解释下面的情况和怀疑。

我正在创建一个网站,可以管理每个用户的很多项目。每个用户只能是所有者或参与者。

我有记录用户的公共区域,项目中所有用户都可以访问的区域,以及只有所有者才能访问的区域。

我为控制器和操作创建了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;
            }
        }
    }
}

对于少数用户来说,没关系。但是对于许多用户来说,我有一个数据库查询来为每个被调用的动作收集相同的信息。所以,我正在考虑使用会话来保存当前用户和项目访问的一些信息。

使用此方案的最佳方式/实践是什么?

0 个答案:

没有答案