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

时间:2011-05-31 15:09:18

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

我有3种不同类型的用户(具有不同的角色)在我的Web应用程序上进行交互,它们都执行某些任务 - 有些可能完全相同,例如创建引用其他人可以对该特定用户是唯一的,例如签字。

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

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

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

注意:我以创建用户的方式离开了asp.net build,我有自己的自定义表,我的自定义机制用于登录系统。我有一个注册的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”,“Supplier”或它们在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);
        }
    }

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

2 个答案:

答案 0 :(得分:4)

编写自定义MembershipProvider和自定义RoleProvider,然后您可以使用属性

修饰控制器类或特定方法
<Authorize(Roles:="ROLENAME")>

你可以学习如何让你的asp mvc在这个question中使用自定义成员资格。这真的很容易。

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

如果你愿意,我可以在某个地方(也许是pastebin)放置一个很好的评论版本的membershipProvider以及我在一个简单的应用程序中使用的角色提供者(它们是在vb.net中制作但我确定这不会是个问题)

答案 1 :(得分:1)

您还可以在基本控制器中编写通用代码,而不是使用Authorize属性来装饰每个操作。请参阅以下网址。

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