MVC中从集中位置的控制器进行基于安全性的重定向



我正在使用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方法中重定向/返回视图,也不知道如何将它从控制器传递到helper类,或者这是否可能。

我相信有更好的方法可以做到这一点,比如使用服务,或者使用属性,并能够将我初始化的bucket对象传入

欢迎提出任何建议!

感谢

这里可能缺少一些内容,但这不只是从UserOrganisationMatchesObjectOrganisation方法返回ActionResult的情况吗?我可能会更改它的名称,这样该方法的作用就更明显了,例如

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");
}
}

这种方法的好处是,它保持了您的业务和;表示逻辑。

最新更新