在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>
在不检查调用者是否被授权正确执行调用的情况下执行重定向/传输将是一个安全漏洞,特别是在这种情况下它需要不同的权限。
非常感谢任何帮助。
非常感谢。
答案 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模式,当您需要传递一些错误等时。)