2011-05-31 53 views
1

我有3种不同类型的用户(具有不同的角色)在我的web应用程序上进行交互,他们都执行一些任务 - 有些可以完全相同,例如,创建一个报价,其他人可以是该特定用户唯一的,例如签署报价。在asp.net中处理不同类型的用户mvc

为了更加清晰,有3种类型的用户:客户,供应商,客户。

客户或客户可以创建报价,但只有客户可以签署报价。

如何确保我的应用程序允许客户访问客户speficic控制器和供应商访问供应商特定的控制器或区域。通过自定义属性?我是否将用户类型存储在cookie中?这安全吗?或会话状态?只要有人登录到系统,我发回一个LoggedOnDTO对象,我在其上存储了用户名,用户ID和用户类型......

注意:我离开了asp.net构建用户的方式,我有我自己的自定义表与我的自定义机制登录到系统。我有一个注册的模型Bindiner,看起来为前缀和我在一个强类型对象的每个动作发送...

示例代码:

[HttpGet] 
public ActionResult AddComment(int quoteid, ClientUserDTO loggedonclientuser) 
{ 

} 

[HttpGet] 
public ActionResult AddCommentSupplier(int quoteid, Supplier loggedonsuppluser) 
{ 

} 

编辑:此方法由于某种原因似乎很简单得多...有什么问题吗?任何可能的安全问题?线程?

我的会话控制器是:

if (_authService.isValidUser(model)) 
{ 
    var data = _authService.GetAuthenticationCookieDetails(model); 
    AuthenticateCookie.AddDetailsToCookie(data); 
    return Redirect(Url.Action("Index", "Activity")); 
} 

当我创建我的饼干......我可以简单的店“ClientUser”,“供应商”或什么角色他们是饼干里。

然后我可以创建一个属性并读取cookie数据以查看它们是否是有效的用户,例如

public class ClientAuthorizationAttribute : AuthorizeAttribute 
    { 
     public bool AlwaysAllowLocalRequests = false; 
     protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
     { 
      if (AlwaysAllowLocalRequests && httpContext.Request.IsLocal) 
      { 
       bool authorized = false; 
       var result = UserDetails.GetTypeFromTicket(httpContext.User.Identity as FormsIdentity); 

       if (result.Equals("client", StringComparison.OrdinalIgnoreCase)) 
       { 
        authorized = true; 
       } 
       //throw no access exception? 
       return authorized; 
      } 
      return base.AuthorizeCore(httpContext); 
     } 
    } 

在我的基础控制器下注册属性,我有一个简单的工作解决方案?

回答

4

编写自定义MembershipProvider和自定义RoleProvider那么你可以使用属性

<Authorize(Roles:="ROLENAME")> 

你可以学习如何让你的ASP MVC使用自定义membershiprovider在此question这是装饰你的CONTROLER类别或具体方法真的很简单。

编辑: 你这样做的方式看起来不错,但我认为你需要很长的路要走。实现您自己的MembershipProvider和您自己的Roleprovider将花费您不超过20分钟的时间......并且您将获得与经过良好测试和记录的系统一起工作的好处,并且仍然具有使用您自己的数据库表进行登录的好处。在一个简单的登录系统中,你只需要在roleprovider(GetRolesForUser和IsUserInRole)中写两个函数,而在membershipprovider(ValidateUser)中只需要一个函数,你就可以使系统工作。

如果你愿意,我可以放置一个位置(也许是pastebin)一个membershipProvider以及我在一个简单的应用程序中使用的角色提供者(他们是在vb中制作的)。净,但我相信这不会是一个问题)

+0

+1是的,这是最好的办法,一旦你看到一些代码非常容易。 – 2011-05-31 15:23:06

+0

谢谢...我将在周一看看这个,并接受你的答案,然后如果它是好的... – Haroon 2011-06-02 11:23:14

+0

如果您需要关于此主题的一些信息,请告诉我。 – Jonathan 2011-06-03 08:06:13

1

你也可以在基础控制器中编写通用代码,而不是用Authorize属性装饰每个动作。请参阅下面的网址。

Good practice to do common authorization in a custom controller factory? 定制控制器工厂/ 5361846#5361846

+0

我喜欢你的代码,但是我觉得最好使用一个授权属性...#1它是线程安全的,我从一个类(AuthorizeAttribute)继承,它只是简单地工作,如果用户无效,属性本身会踢用户不在系统中... – Haroon 2011-06-10 09:21:22