Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net mvc中处理不同类型的用户_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

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

C# 在asp.net mvc中处理不同类型的用户,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有3种不同类型的用户(具有不同的角色)在我的web应用程序上进行交互,他们都执行一些任务-一些可以完全相同,例如创建报价,其他用户可以是该特定用户独有的,例如注销报价 为了更清楚,有3种类型的用户:客户、供应商、客户 客户或客户可以创建报价,但只有客户可以签署报价 如何确保我的应用程序允许客户端访问客户端专用控制器,以及允许供应商访问特定于供应商的控制器或区域。通过自定义属性?我是否将用户类型存储在cookie中?这安全吗?还是会话状态?一旦有人登录到系统,我会将LoggedOnDTO发送回我

我有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);
        }
    }
在我的基本控制器下注册该属性,我就有了一个简单的工作解决方案???

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

<Authorize(Roles:="ROLENAME")>
这真的很简单

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

如果您愿意,我可以在某个地方(可能是pastebin)放置一个评论良好的membershipProvider版本以及我在一个简单应用程序中使用的roleprovider版本(它们是在vb.net中制作的,但我相信这不会有问题)

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

<Authorize(Roles:="ROLENAME")>
这真的很简单

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


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

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


自定义控制器工厂/5361846#5361846

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


自定义控制器工厂/5361846#5361846

+1是的,这是最好的方法,并且在看到一些代码后非常简单。谢谢。。。我将在周一对此进行调查,如果可以的话,我会接受你的答案……如果你需要关于这个主题的信息,请告诉我。@Jonathan,我已经更新了我的代码,以显示我是如何做到这一点的,要不要评论?@Jonathan-是的,那太好了,请提供一个链接。。。我想在我看到一个合适的例子后,我会把你的答案标记为正确的。我遇到的问题是-我的解决方案对我来说更简单,它实现了同样的目的,是的,它不是那么优雅或可扩展。。。不管怎样-我正在使用Ninject,我必须将我的提供商与域服务层挂钩,如果我能看到一些代码,那么也许我可以找出其余的:p+1是的,这是最好的方法,一旦你看到一些代码,就很容易了。谢谢。。。我将在周一对此进行调查,如果可以的话,我会接受你的答案……如果你需要关于这个主题的信息,请告诉我。@Jonathan,我已经更新了我的代码,以显示我是如何做到这一点的,要不要评论?@Jonathan-是的,那太好了,请提供一个链接。。。我想在我看到一个合适的例子后,我会把你的答案标记为正确的。我遇到的问题是-我的解决方案对我来说更简单,它实现了同样的目的,是的,它不是那么优雅或可扩展。。。不管怎样-我正在使用Ninject,我必须将我的提供者与域服务层挂钩,如果我能看到一些代码,那么也许我可以找出其余的:pI喜欢你的代码,但是我觉得使用authorize属性更好#1它是线程安全的,我继承的类(AuthorizeAttribute)只是简单的工作,如果用户是无效的属性本身将踢出系统的用户…我喜欢你的代码,但我觉得它更好地使用授权属性#1它是线程安全的,我是从一个简单工作的类(AuthorizeAttribute)继承的,如果用户无效,该属性本身将把用户踢出系统。。。