1

我是授权和认证的新手,但我最近开始在我的大学项目中使用 Simplemembership。我设法让它运行起来。我的问题是,我不确定如何处理某个问题。

有一个项目区域和内部控制器,可通向几个不同的页面。所有用户都可以访问项目区域和其中的页面,但他们应该只能访问和更改与他们所属的“项目”相关的页面/内容。这不是角色问题。

我想知道一种创建过滤器的简单方法,根据它们的依赖关系限制访问,因此用户不会只在 url 中键入“id”并查看属于另一个组的内容。最好不必自定义提供程序,因为它不是我应用程序的重点。

我将 MVC 4 与 C# 和 EF 5 一起使用。

4

2 回答 2

0

你有两个选择:

首先,您可能会忘记编写自定义授权属性,而只是在您的操作方法中进行检查。但是,编写自定义授权属性并不难,应该适用于您的场景。例如,我写了一个基于特定权限而不是角色的。

像这样的东西应该适合你:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CustomAuthorize : AuthorizeAttribute
{
    private int project_id;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (base.AuthorizeCore(httpContext)) {
            if (YourCurrentUserObject.IsPartofProject(project_id)) {
                return true;
            }
        }

        return false;
    }

    protected override void OnAuthorization(AuthorizationContext filterContext) 
    {
        //get the "project id" parameter from your action method
        project_id = Convert.ToInt32(filterContext.RouteData.Values.SingleOrDefault(x => x.Key == "project_id").Value);

        base.OnAuthorization(filterContext);
    } 
}
于 2013-10-25T14:17:40.207 回答
0

一种解决方案是拥有一个映射用户和项目之间关系的表。您很可能已经有这样的表。我不熟悉您的应用程序域,但我假设我们谈论的是多对多关系,其中一个用户可以有很多项目,而项目可以有很多用户。如果您为 SimpleMembership 使用的用户使用相同的 ID,这将非常简单。在根据 URL 中传递的项目 ID 返回项目信息的控制器的操作中,首先通过调用WebSecurity.IsAuthenticated检查用户是否已通过身份验证. 如果他们未通过身份验证,则重定向到登录页面。然后在您的查询中将项目信息加入到将用户映射到项目的表中,并确保当前用户是所请求项目的一部分。您可以通过调用WebSecurity.CurrentUserId来获取当前用户 ID 。

于 2013-10-28T13:20:20.780 回答