ServiceStack服务正被重定向到MVC表单登录页面

时间:2015-03-01 21:39:33

标签: c# asp.net-mvc servicestack

我已经在需要使用自定义CredentialAuthenticationProvider进行身份验证的ServiceStack服务上编写了一些测试。

如果我通过不使用servicestack进行身份验证来创建测试,则会收到序列化错误而不是401错误。序列化错误是因为服务正在重定向到MVC登录HTML页面。

如果呼叫在serviceStack服务的/ api / path上,我怎样才能阻止重定向到MVC,以便服务返回401?

    [TestMethod]
    public void DeleteUser_not_authenticated()
    {
        var client = new JsonServiceClient(STR_APIURL);
        var resp1 = client.Post(new Auth() { UserName = "user", Password = "***" });
        Assert.IsTrue(resp1.UserName == "user");
        var user = client.Get(new GetSupportUser { Email = "test@gmail.com" });
        client.Post(new Auth { provider = "logout" });
        try
        {
            var resp = client.Delete(user);

        }
        catch (HttpException e)
        {
            Assert.IsTrue(e.GetHttpCode() == 401);
        }
    }

修改

根据Mythz的建议,我在global.aspx中尝试了这个,但是这并没有停止重定向:

    protected void Application_EndRequest(object src, EventArgs e)
    {
        ServiceStack.MiniProfiler.Profiler.Stop();

        var ctx = (HttpApplication)src;
        if (ctx.Request.Path.Contains("/api/"))
            ctx.Response.SuppressFormsAuthenticationRedirect = true;
    }

2 个答案:

答案 0 :(得分:0)

如果您使用的是.NET 4.5,则可以禁用内置身份验证重定向 通过设置您可以在Global.asax.cs中添加的HttpResponse.SuppressFormsAuthenticationRedirect=true

protected void Application_EndRequest(Object sender, EventArgs e)
{
    var ctx = (HttpApplication)sender;
    var suppressForPath = ctx.Request.PathInfo.StartsWith("/api");
    ctx.Response.SuppressFormsAuthenticationRedirect = suppressForPath;
}

对于早期版本的ASP.NET,请参阅Form Hijacking Prevention上的ServiceStacks文档,以注册自定义SuppressFormsAuthenticationRedirectModule IHtptModule以防止此情况发生。

答案 1 :(得分:0)

我将@mythz的答案更改为Begin_Request而不是End_Request,现在它正在阻止重定向到表单身份验证并返回401响应。

    protected void Application_BeginRequest(object src, EventArgs e)
    {
        var ctx = (HttpApplication) src;
        var suppressForPath =ctx.Request.Path.StartsWith("/api");
        ctx.Response.SuppressFormsAuthenticationRedirect = suppressForPath;
    }