【问题标题】:Handling different types of users in asp.net mvc在 asp.net mvc 中处理不同类型的用户
【发布时间】:2011-05-31 15:09:17
【问题描述】:

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

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

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

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

注意:我以创建用户的方式放弃了 asp.net 构建,我有自己的自定义表以及用于登录系统的自定义机制。我有一个注册的模型绑定器来查找前缀,然后我向每个操作发送一个强类型对象...

示例代码:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    <Authorize(Roles:="ROLENAME")>
    

    你可以在这个question 中学习如何让你的asp mvc 使用自定义的membershiprovider,这真的很简单。

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

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

    【讨论】:

    • +1 是的,这是最好的方法,而且一旦你看到一些代码就很容易了。
    • 谢谢...我将在星期一对此进行研究,如果可以的话,我会接受您的回答...
    • 如果您需要有关此主题的信息,请告诉我。
    • @Jonathan,我已经更新了我的代码以展示我会如何做到这一点,愿意发表评论吗?
    • @Jonathan- 是的,那太好了,请提供一个链接......我想我会在看到一个合适的例子后将你的答案标记为正确。我遇到的问题是-我的解决方案对我来说感觉更简单,它实现了相同的目的,是的,它不是那么优雅或可扩展...无论如何-我正在使用 Ninject,我必须将我的提供程序与域服务层挂钩,如果我能看到一些代码,那么也许我可以找出其余的:p
    【解决方案2】:

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

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

    【讨论】:

    • 我喜欢你的代码,但是我觉得最好使用授权属性...#1它是线程安全的,我继承自一个简单有效的类(AuthorizeAttribute),如果用户是无效的属性本身会将用户踢出系统...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2010-10-07
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多