问题描述
|
我在Web应用程序上有3种不同类型的用户(具有不同的角色)进行交互,他们都执行某些任务-有些可以完全相同,例如创建报价,其他报价对于该特定用户而言可能是唯一的,例如签署报价。
为了更加清晰,三种用户类型:客户,供应商,客户。
客户或客户可以创建报价,但是只有客户可以签署报价。
如何确保我的应用程序允许客户访问客户专用控制器,而供应商则可以访问供应商特定的控制器或区域。通过自定义属性?是否将用户类型存储在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 \”,\“供应商\”或它们在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\")>
您可以在此问题中了解如何使您的asp mvc使用自定义的Membershiprovider。这很简单。
编辑:
您的处理方式看起来不错,但我认为您需要走很长的路。实施您自己的MembershipProvider和Roleprovider将花费您不超过20分钟的时间……并且您将受益于使用经过良好测试和记录的系统,并仍然拥有使用自己的数据库表进行登录的好处。在简单的登录系统中,您只需要在roleprovider中编写两个函数(GetRolesForUser和IsUserInRole),而在Membershipprovider中仅编写一个函数(ValidateUser),就可以使系统正常工作。
如果您愿意,我可以在某个地方(也许是pastebin)放上我在简单应用程序中使用的MembershipProvider以及角色提供程序的评论良好的版本(它们是在vb.net中制作的,但我确定不会有问题)
, 您也可以在基本控制器中编写通用代码,而不是用Authorize属性来修饰每个动作。请参考以下网址。
在自定义控制器工厂中进行通用授权的良好实践?
custom-controller-factory / 5361846#5361846