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

本文关键字:同类型 用户 处理 asp net mvc | 更新日期: 2023-09-27 17:57:59

我有三种不同类型的用户(具有不同的角色)在我的web应用程序上交互,他们都执行一些任务-有些可以完全相同,例如创建报价,另一些可以是特定用户独有的,例如签核报价。

为了更清楚起见,有三种类型的用户:客户、供应商、客户。

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

我如何确保我的应用程序允许客户访问特定于客户的控制器,并允许供应商访问特定于供应商的控制器或区域。通过自定义属性?我是否将用户类型存储在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"、"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);
        }
    }

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

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

编写一个自定义MembershipProvider和一个自定义RoleProvider,然后可以用属性装饰您的控制器类或特定方法

<Authorize(Roles:="ROLENAME")>

在这个问题中,您可以学习如何使您的aspmvc使用自定义membershiprovider。这真的很容易。

编辑:你做这件事的方式看起来不错,但我认为你需要走很长的路。实现您自己的MembershipProvider和您自己的Roleprovider将不超过20分钟。。。您将可以使用经过良好测试和文档化的系统,并且仍然可以使用自己的数据库表进行登录。在一个简单的登录系统中,您只需在角色提供程序中编写两个函数(GetRolesForUser和IsUserInRole),在成员提供程序中只需编写一个函数(ValidateUser),系统就会正常工作。

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

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

在自定义控制器工厂进行常见授权的良好实践?自定义控制器工厂/5361846#5361846