我正在使用ASP.NET / MVC并需要为ActionResult / ViewResult控制器方法添加一些安全措施。基本上我需要确保用户与页面关联的组织相关联,他们具有什么级别的访问权限,并在需要时重定向。
我通常会使用属性,但需要使用一些业务逻辑来确定返回视图/重定向的位置,并且我需要在执行之前使用查询字符串值初始化非常量用户定义对象。我希望通过使用辅助类(对建议开放)来集中逻辑,但我不确定如何访问上下文/从辅助类中进行重定向。
例如,页面操作就像......
public ActionResult Index(string id)
{
Models.Bucket bucket = new Bucket();
InitBucket(bucket, id);
SecurityHelper.UserOrganisationMatchesObjectOrganisation(CurrentUser, bucket);
}
并在SecurityHelper中
public static void UserOrganisationMatchesObjectOrganisation(Model.User user, Bucket bucket)
{
//if various logic in user and bucket occur return View("NewPage", bucket)
//else return RedirectResult("~/yournotallowed")
}
唯一的问题是你不能在没有上下文的情况下在helper方法中重定向/返回视图,并且不确定如何将它从控制器传递给辅助类或者是否可能。
我确信有更好的方法可以使用服务,或使用属性并能够传递初始化的存储桶对象。
欢迎任何建议!
由于
答案 0 :(得分:1)
我可能在这里遗漏了一些内容,但这不仅仅是从ActionResult
方法返回UserOrganisationMatchesObjectOrganisation
的情况吗?我可能会更改它的名称,这样该方法将会更加明显,例如。
public static class Security
{
public static ActionResult GetActionResultForUser(Model.User user, Bucket bucket)
{
//if various logic in user and bucket occur return View("NewPage", bucket)
//else return RedirectResult("~/yournotallowed")
}
}
...
public ActionResult Index(string id)
{
Models.Bucket bucket = new Bucket();
InitBucket(bucket, id);
return Security.GetActionResultForUser(CurrentUser, bucket);
}
另一种方法可能是引入一个Service
类,它可以返回某种状态(或抛出异常),然后你可以用它来确定返回哪个视图,例如。
private BucketService _bucketService = new BucketService();
...
public ActionResult Index(string id)
{
try
{
var bucket = _bucketService.GetBucketForUser(CurrentUser, id);
return View("NewPage", bucket);
}
catch (InsufficientPriviledgesException)
{
return RedirectResult("~/yournotallowed");
}
}
这种方法的好处在于它可以保持您的业务与业务之间的清晰分离。演示逻辑。