2015-03-01 3 views
0

Я пишу несколько тестов сервисов ServiceStack, требующих аутентификации с использованием пользовательского CredentialAuthenticationProvider.Служба ServiceStack перенаправляется на страницу входа в формы MVC

Если я создаю тест, не проверяя подлинность с помощью служебной программы, я получаю ошибку сериализации вместо ошибки 401. Ошибка сериализации - это то, что служба перенаправляется на HTML-страницу входа MVC.

Как предотвратить перенаправление на MVC, когда вызов находится в/api/path для сервисов serviceStack, чтобы служба вместо этого возвращала 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 = "[email protected]" }); 
     client.Post(new Auth { provider = "logout" }); 
     try 
     { 
      var resp = client.Delete(user); 

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

Редактировать

Per 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

Я изменил @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; 
    } 
0

Если вы используете .NET 4.5 , вы можете отключить встроенный аудит аутентификации , установив HttpResponse.SuppressFormsAuthenticationRedirect=true, который вы можете добавить в свой файл Global.asax.cs:

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 см. Документы ServiceStacks по адресу Form Hijacking Prevention для регистрации пользовательского SuppressFormsAuthenticationRedirectModule IHtptModule для предотвращения этого.

+0

Я не могу этого сделать, поскольку у меня есть внешний интерфейс MVC, использующий проверку подлинности форм. Этот ответ, я думаю, близок, но относится к вызовам AJAX http://stackoverflow.com/a/13811295/4621260. – brussell

+0

Я мог бы заставить ваше предложение работать, если я проверю запрос на/api * в пути. – brussell

+0

@brussell Я обновил ответ, чтобы ограничить запросы '/ api *'. – mythz

Смежные вопросы