3

在 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"权限。

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

任何帮助深表感谢。

非常感谢。

4

2 回答 2

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 管道除外)。

于 2013-04-16T14:27:35.817 回答
-2

So in case you want to pass data between two get actions you can serialize the object you want to pass - add it to routes and thed do a redirect like

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

then you will be able to deserialize it on the other action and pass to your custom responce. But there will be limitation of url max length. Or you can try to use a TempData (at least it works nice for Post-Redirect-Get pattern when you need to pass some error etc.)

于 2013-04-16T14:36:28.477 回答