在asp.net mvc中处理不同类型的用户

问题描述

| 我在Web应用程序上有3种不同类型的用户(具有不同的角色)进行交互,他们都执行某些任务-有些可以完全相同,例如创建报价,其他报价对于该特定用户而言可能是唯一的,例如签署报价。 为了更加清晰,三种用户类型:客户,供应商,客户。 客户或客户可以创建报价,但是只有客户可以签署报价。 如何确保我的应用程序允许客户访问客户专用控制器,而供应商则可以访问供应商特定的控制器或区域。通过自定义属性?是否将用户类型存储在Cookie中?这样安全吗?或会话状态?有人登录到系统后,我会发回一个LoggedOnDTO对象,在该对象上存储用户名用户ID和用户类型。 注意:我从创建用户的方式离开了asp.net构建,我拥有自己的自定义表以及用于登录系统的自定义机制。我有一个注册的Model 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\"));
}
创建cookie时,我可以简单地存储\“ ClientUser \”,\“供应商\”或它们在cookie中的作用。 然后,我可以创建一个属性并读取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);
        }
    }
在我的基本控制器下注册属性我有一个简单的工作解决方案?     

解决方法

        编写一个自定义的MembershipProvider和一个自定义的RoleProvider,然后您就可以使用属性来装饰控件类或特定方法
<Authorize(Roles:=\"ROLENAME\")>
您可以在此问题中了解如何使您的asp mvc使用自定义的Membershiprovider。这很简单。 编辑:   您的处理方式看起来不错,但我认为您需要走很长的路。实施您自己的MembershipProvider和Roleprovider将花费您不超过20分钟的时间……并且您将受益于使用经过良好测试和记录的系统,并仍然拥有使用自己的数据库表进行登录的好处。在简单的登录系统中,您只需要在roleprovider中编写两个函数(GetRolesForUser和IsUserInRole),而在Membershipprovider中仅编写一个函数(ValidateUser),就可以使系统正常工作。 如果您愿意,我可以在某个地方(也许是pastebin)放上我在简单应用程序中使用的MembershipProvider以及角色提供程序的评论良好的版本(它们是在vb.net中制作的,但我确定不会有问题)     ,        您也可以在基本控制器中编写通用代码,而不是用Authorize属性来修饰每个动作。请参考以下网址。 在自定义控制器工厂中进行通用授权的良好实践? custom-controller-factory / 5361846#5361846