从一个api控制器方法重定向到另一个api控制器方法,并重新应用自定义授权过滤器

时间:2013-04-16 12:39:17

标签: c# asp.net-mvc asp.net-web-api

在WebApi中,我有一个控制器动作,我希望能够重定向到另一个ApiController动作。我使用自定义AuthorizeAttribute(CustomAuthorizaton)属性来装饰这些方法,因此任何重定向都必须通过这些传入的安全过滤器。

以下是一个例子:

public class SomeController : ApiController
{

    [CustomAuthorization("Foo")]
    [System.Web.Http.HttpGet]
    public CustomResponse SomeMethod(int arg1, int arg2)
    {
        ....
    }

}

public class AnotherController : ApiController
{

    [CustomAuthorization("Bar")]
    [System.Web.Http.HttpGet]
    public CustomResponse AnotherMethod(int arg1, int arg2)
    {
        if(arg1 == 2){

           return Redirect to SomeMethod(...) in SomeController ???

        }


    }

}

您会注意到我也返回了我自己的自定义响应对象(在此示例中为CustomResponse)。

所以我需要帮助的是如何返回重定向产生的CustomResponse,并让重定向通过CustomAuthorization过滤器。

要澄清一下,调用AnotherMethod只需要"Bar"权限,但在重定向到SomeMethod期间,我们需要验证来电者是否也拥有"Foo"权限。< / p>

在不检查调用者是否被授权正确执行调用的情况下执行重定向/传输将是一个安全漏洞,特别是在这种情况下它需要不同的权限。

非常感谢任何帮助。

非常感谢。

2 个答案:

答案 0 :(得分:1)

要模拟重定向而不支付网络往返的费用,您可以创建一个内存服务器,其配置与您的Web API相同,并使用HTTPClient实例来调用它。

您可以执行以下操作来设置内存服务器

var httpConfiguration = new HttpConfiguration();
WebApiConfig.Register(httpConfiguration)
var httpServer = new HttpServer(httpConfiguration);

然后你可以像这样调用它

var httpClient = new HttpClient(httpServer);
httpClient.GetAsync("http://mysite.com/mycontroller/redirectUrl");

最好将这些对象全局存储在某处,这样您就不会每次都重新创建它们。 HttpClient是线程安全的,所以不用担心重新使用它。

此方法可确保您的请求完成与任何实际网络请求完全相同的步骤(ASP.NET管道除外)。

答案 1 :(得分:-2)

因此,如果您想在两个get动作之间传递数据,您可以序列化您想要传递的对象 - 将其添加到路由中并执行重定向,如

return RedirectToAction(ActionName,ControllerName, new { a = Seriliaze(someObject)})

然后您将能够在其他操作上反序列化它并传递给您的自定义响应。但是url max length会受到限制。或者您可以尝试使用TempData(至少它适用于Post-Redirect-Get模式,当您需要传递一些错误等时。)