在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);
}
}
在我的基本控制器下注册属性,我就有了一个简单的工作解决方案???
编写一个自定义MembershipProvider和一个自定义RoleProvider,然后可以用属性装饰您的控制器类或特定方法
<Authorize(Roles:="ROLENAME")>
在这个问题中,您可以学习如何使您的aspmvc使用自定义membershiprovider。这真的很容易。
编辑:你做这件事的方式看起来不错,但我认为你需要走很长的路。实现您自己的MembershipProvider和您自己的Roleprovider将不超过20分钟。。。您将可以使用经过良好测试和文档化的系统,并且仍然可以使用自己的数据库表进行登录。在一个简单的登录系统中,您只需在角色提供程序中编写两个函数(GetRolesForUser和IsUserInRole),在成员提供程序中只需编写一个函数(ValidateUser),系统就会正常工作。
如果你愿意,我可以在某个地方(也许是pastebin)放一个评论良好的membershipProvider版本,以及我在一个简单的应用程序中使用的角色提供者版本(它们是在vb.net中制作的,但我相信这不会是个问题)
您也可以在基本控制器中编写通用代码,而不是用Authorize属性装饰每个操作。请参阅以下网址。
在自定义控制器工厂进行常见授权的良好实践?自定义控制器工厂/5361846#5361846