1

我是新来的授权和Autentication,但是我最近在我的大学项目中使用Simplemembership启动。我设法让它运行。我的问题是,我不确定如何处理某个问题。Simplemembership过滤器用户访问到角色不适用页(ASP.NET MVC 4)

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

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

我使用MVC 4与C#和EF 5

+0

这就足够复杂了,您必须自定义提供程序。 – Mansfield

+0

如果它证明自己太复杂了,我可能会放弃它,因为它不是我的“学期论文/课程作业”的重点(我不确定这是否是正确的术语,这是我毕业的最后一项工作)。 尽管如此,我想学习如何在这种情况下继续进行,因为我是一般编程新手 –

+0

我不认为我提供的答案是复杂的。但请记住,如果您还有其他问题,这里有很多人愿意帮忙!即使是那些不是主要关注点的项目,也应该适当地保持安全的习惯。 – Mansfield

回答

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); 
    } 
} 
+0

感谢您的回复。我应该写和自定义属性来替换默认的[Authorize]属性(在我的情况下是在其他控制器中的其他人继承它)或可以与它一起使用? 我可以在Actions上使用它来限制项目,而默认继续像往常一样需要验证吗? –

+0

@WilliamAlexandre如果您想根据项目ID进行限制,则必须在方法上具有自定义属性。您可以继续使用控制器上的默认属性。我刚刚做的代码编辑会包含默认授权('base.AuthorizeCore()'),所以你不需要同时拥有两个属性。 – Mansfield

0

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

相关问题