0

我正在使用 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")
    }

唯一的问题是您不能在没有上下文的情况下在辅助方法中重定向/返回视图,并且不确定如何将其从控制器传递给辅助类或是否可能。

我确信有更好的方法来做到这一点,比如使用服务,或者使用属性并能够传递我初始化的存储桶对象。

欢迎任何建议!

谢谢

4

1 回答 1

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

这种方法的好处是它在您的业务和表示逻辑之间保持了清晰的分离。

于 2012-12-13T12:52:46.017 回答