Asp.net mvc 在MVC中,从集中位置的控制器进行基于安全性的重定向

Asp.net mvc 在MVC中,从集中位置的控制器进行基于安全性的重定向,asp.net-mvc,security,Asp.net Mvc,Security,我正在使用ASP.NET/MVC,需要向ActionResult/ViewResult控制器方法添加一些安全措施。基本上,我需要确保用户与与页面相关的同一组织相关联,他们具有何种访问级别,并在需要时重定向他们 我通常会为此使用属性,但需要使用一些业务逻辑来确定返回视图/重定向的位置,并且在执行此操作之前,我需要使用查询字符串值初始化非常量用户定义对象。我想通过使用helper类(开放给建议)来集中逻辑,但我不确定如何从helper类访问上下文/进行重定向 例如,页面操作就像 public Act

我正在使用ASP.NET/MVC,需要向ActionResult/ViewResult控制器方法添加一些安全措施。基本上,我需要确保用户与与页面相关的同一组织相关联,他们具有何种访问级别,并在需要时重定向他们

我通常会为此使用属性,但需要使用一些业务逻辑来确定返回视图/重定向的位置,并且在执行此操作之前,我需要使用查询字符串值初始化非常量用户定义对象。我想通过使用helper类(开放给建议)来集中逻辑,但我不确定如何从helper类访问上下文/进行重定向

例如,页面操作就像

public ActionResult Index(string id)
{
            Models.Bucket bucket = new Bucket();
            InitBucket(bucket, id);

            SecurityHelper.UserOrganisationMatchesObjectOrganisation(CurrentUser, bucket);
}
在安全助手中

    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对象

欢迎任何建议


谢谢

我可能在这里遗漏了一些东西,但这不就是从您的
用户组织匹配对象组织
方法返回
操作结果
的情况吗?我可能会更改它的名称,以便更清楚地了解该方法的作用

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);
}
另一种方法是引入一个
服务
类,该类可以返回某种状态(或引发异常),然后您可以使用它来确定要返回的视图,例如

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");
    }
}
这种方法的好处在于,它将业务逻辑和表示逻辑保持干净的分离