我已经在需要使用自定义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;
}
答案 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;
}