繁体   English   中英

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

[英]Handling different types of users in asp.net mvc

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

为了更清楚,3 类用户:客户、供应商、客户。

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

如何确保我的应用程序允许客户访问客户特定的控制器和供应商访问供应商特定的控制器或区域。 通过自定义属性? 我是否将用户类型存储在 cookie 中? 这安全吗? 还是 Session state? 一旦有人登录系统,我就会发回一个 LoggedOnDTO object,我在上面存储用户名、用户 ID 和用户类型......

注意:我以创建用户的方式远离 asp.net 构建,我有自己的自定义表和用于登录系统的自定义机制。 我有一个已注册的 Model 绑定器,用于查找前缀,然后我将强类型 object 发送到每个操作...

示例代码:

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

}

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

}

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

我的 session controller 是:

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

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

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

<Authorize(Roles:="ROLENAME")>

你可以在这个问题中学习如何让你的asp mvc使用自定义的membershiprovider 这真的很容易。

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

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

您还可以在基础 controller 中编写通用代码,而不是使用 Authorize 属性装饰每个操作。 请参考下面的 url。

在自定义 controller 工厂进行共同授权的良好做法? 自定义控制器工厂/5361846#5361846

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM