У нас есть приложение 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.");
}
...
Имейте в виду, что аутентификация на основе токена работает, поэтому я предполагаю, что это параметр конфигурации, отсутствующий или неправильно сконфигурированный, или проблема упорядочения конвейера.
СПАСИБО!