【发布时间】: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