2015-11-16 5 views
4

У нас есть приложение MVC 5, к которому мы добавили Web Api Controllers, чтобы обеспечить функциональность REST API. Мы успешно внедрили аутентификацию OAuth через конвейер OWIN с использованием пользовательского класса поставщика OAuth.Почему context.Request.Context.Authentication.SignIn не создает cookie?

Теперь мы хотим реализовать аутентификационные куки, а также для защиты статических ресурсов на сервере. Я уверен, что есть миллион других способов сделать это, но запрос на ресурс - это ссылка непосредственно на этот ресурс, поэтому я не могу использовать токен OAuth или какой-либо другой механизм, поэтому мы хотим использовать файлы cookie ... браузер отправляет их уже, не нужно ничего менять.

Из всего, что я прочитал, можно выполнить аутентификацию Toker Token и аутентификацию Cookie с помощью OWIN Pipeline. В основном веб-API будет использовать токены-носители, потому что все, что клиент будет поставлять, и запросы на определенные статические ресурсы на сервере будут использовать Cookies, которые отправляются по всем запросам.

Наша проблема заключается в том, что с помощью приведенного ниже кода cookie cookie никогда не генерируется. На протяжении всего конвейера я никогда не видел заголовок set-cookie, поэтому я добавил Kentor Cookie Saver к конвейеру ... он должен помочь.

WebApiConfig.cs

... 
config.SuppressDefaultHostAuthentication(); 
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 
... 

Startup.Auth.cs

... 
app.UseOAuthBearerTokens(OAuthOptions); 
// I was told this might help with my cookie problem...something to do with System.Web stripping Set-Cookie headers 
app.UseKentorOwinCookieSaver(); 
app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = Microsoft.Owin.Security.Cookies.CookieAuthenticationDefaults.AuthenticationType, 
    AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 
    ExpireTimeSpan = TimeSpan.FromHours(4) 
}); 
... 

Пользовательские OAuth Provider

... 
// Creates our claims and properties...keep in mind that token based authentication is working 
CreatePropertiesAndClaims(acct, out properties, out claims); 
if (IsAccountAuthorized(claims)) 
{ 
    AuthenticationProperties authProps = new AuthenticationProperties(properties); 
    ClaimsIdentity claimsIdentity = new ClaimsIdentity(context.Options.AuthenticationType); 
    claimsIdentity.AddClaims(claims); 

    AuthenticationTicket ticket = new AuthenticationTicket(claimsIdentity, authProps); 
    context.Validated(ticket); 

    ClaimsIdentity cookieIdentity = new ClaimsIdentity(claims, Microsoft.Owin.Security.Cookies.CookieAuthenticationDefaults.AuthenticationType); 
    context.Request.Context.Authentication.SignIn(cookieIdentity); // This should create the auth cookie!??! 
} 
else 
{ 
    context.SetError("Unauthorized", "You don't currently have authorization. Please contact support."); 
} 
... 

Имейте в виду, что аутентификация на основе токена работает, поэтому я предполагаю, что это параметр конфигурации, отсутствующий или неправильно сконфигурированный, или проблема упорядочения конвейера.

СПАСИБО!

ответ

0

Я знаю, что это поздний ответ, но мы столкнулись с той же проблемой. Мой коллега и я провели 4 часа, пытаясь понять, почему. Вот ответ, который, надеюсь, может спасти кого-то другого от удара головой о стену.

Осмотрите ответ, вы увидите, что есть Set-Cookie:.AspNet.Cookies=LqP1uH-3UZE-ySj4aUAyGa8gt .... Но куки он не сохраняется. Что вам нужно сделать, в вашем вызове ajax включить учетные данные.

$.ajax({ 
    url: url, 
    type: 'POST', 
    xhrFields: { 
     withCredentials: true 
    } 
) 

мы используем Fetch API, это выглядит следующим образом

fetch(url, { 
    method: 'post', 
    headers: { 
    "Content-type": "application/x-www-form-urlencoded; charset=UTF-8" 
    }, 
    credentials: 'include' 
}) 
Смежные вопросы