2015-02-20 3 views
0

моя ситуация такова: Я работаю с mvc5 и webapi2 внутри того же проекта. Я начал работать с mvc, и поскольку мне нужны функции аутентификации и авторизации, я решил использовать личность. Затем из-за меняющихся требований мне нужно было внедрить веб-службу, поэтому я решил использовать webapi2, но ее также нужно было пройти аутентификацию, поэтому я выбрал базовую авторизацию в качестве своего метода проверки подлинности. Для этого я использовал собственный фильтр проверки подлинности. Everytime что-то пойдет не так («нет полномочий», «неправильные учетных данных») этот фильтр возвращает unauthorizedResult результата через свойство контекста результата:Как отличить ответ mvc 5 от ответа веб-api 2?

context.Result = new UnauthorizedResult(new AuthenticationHeaderValue[] { new AuthenticationHeaderValue("Basic") }, context.Request); 

Это на самом деле отправить код статуса 401 через ответ (я проверил его с помощью отладчик). Проблема в том, что в моем клиенте я получаю код состояния 200. я понял, что это потому, что я получаю страницу входа в систему, как результат, и все из-за этого блока кода, который я установил, когда я начал настроил мой MVC приложение:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Cuenta/Login"), 
}); 

как-то, в каком-то контексте конвейер, мой несанкционированный ответ webapi улавливается и рассматривается как ответ, который исходит от контроллера mvc. Так, пожалуйста, как я избегаю этого? Мне нужно получить код состояния 401, когда мой веб-сервис попытается получить защищенный ресурс, но мне по-прежнему нужна функция «вернуться в логин, если она была обеспечена» для моих защищенных ресурсов в части mvc моего приложения.

Извините, что я новичок в этом, а также извините за мое письмо. Спасибо.

ответ

0

Если и только если ваш веб-API маршрутов, а не ваш MVC содержит /api/ вы можете решить его путем создания пользовательских CookieAuthenticationOptions.Provider.OnApplyRedirect так:

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
var provider = new CookieAuthenticationProvider(); 
var originalHandler = provider.OnApplyRedirect; 

provider.OnApplyRedirect = context => 
{ 
    if (!HttpContext.Current.Request.Url.AbsoluteUri.Contains("/api/")) 
    { 
     var routeValues = new RouteValueDictionary(); 
     var uri = new Uri(context.RedirectUri); 
     var returnUrl = HttpUtility.ParseQueryString(uri.Query)[context.Options.ReturnUrlParameter]; 
     routeValues.Add(context.Options.ReturnUrlParameter, returnUrl); 
     per.Action("login", "account", routeValues); 
     context.RedirectUri = newUri; 
     originalHandler.Invoke(context); 
    } 
}; 

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString(urlHelper.Action("Login", "Account")), 
    Provider = provider 
}); 
+0

Спасибо. Я собираюсь проверить эту альтернативу, кажется более подходящей, что временное решение, которое я использую прямо сейчас. что я сделал, это запустить мою службу webapi с помощью 'app.useWebApi (config)' в моем классе запуска owin перед установкой блока 'app.userCookieAuthentication ... '. – JorgeEspinoza

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