Аутентификация Оуэна не испускает куки
У меня есть следующие действия в контроллере входа. В целях тестирования я не использую форму входа в действие Index. Вместо этого я создаю идентификацию претензий и регистрируюсь. Это действие ПОЛУЧИТЬ, а не ПОСТ. Это создает идентичность претензий и использовать это для AuthenticationManager.SignIn
, Но когда я проверял файлы cookie браузера, я не смог найти файл cookie аутентификации. Я пытаюсь выяснить, что пошло не так.
[AllowAnonymous]
public ActionResult Index()
{
var identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "30"));
identity.AddClaim(new Claim(ClaimTypes.Name, "JFid"));
identity.AddClaim(new Claim(ClaimTypes.Email, "test"));
AuthenticationManager.SignIn(new AuthenticationProperties()
{
IsPersistent = true,
ExpiresUtc = DateTime.UtcNow.AddDays(7)
}, identity);
return View();
}
А также я включил проверку подлинности cookie в OWIN.
[assembly: OwinStartup(typeof(D.Support.WebStartup))]
namespace D.Support
{
public class WebStartup
{
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new Microsoft.Owin.Security.Cookies.CookieAuthenticationOptions()
{
LoginPath = new PathString("/MyLoginPath"),
CookieName = "MyCookieName",
CookieHttpOnly = true,
});
}
}
}
2 ответа
Вы должны установить ClaimsIdentity
AuthenticationType
так же, как CookieOption AuthenticationType
app.UseCookieAuthentication(new Microsoft.Owin.Security.Cookies.CookieAuthenticationOptions()
{
LoginPath = new PathString("/MyLoginPath"),
CookieName = "MyCookieName",
CookieHttpOnly = true,
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie
});
Просто чтобы поместить здесь мое открытие, если кому-то интересно, почему нам нужно делать то, что указано в принятом ответе.
Если вы не укажете AuthenticationType в своих CookieAuthenticationOptions, значение по умолчанию, которое он будет использовать, будет CookieAuthenticationDefaults.AuthenticationType, который имеет значение «Cookies».
И DefaultAuthenticationTypes.ApplicationCookie из пакета Microsoft.AspNet.Identity имеет строковое значение «ApplicationCookie».
А в методе ApplyResponseGrantAsync() объекта CookieAuthenticationHandler, который вызывается для добавления модуля проверки подлинности в заголовок ответа, вызывается следующий код. И если тип аутентификации не совпадает с идентификатором утверждения, он вернет null.
/// <summary>
/// Find response sign-in details for a specific authentication middleware
/// </summary>
/// <param name="authenticationType">The authentication type to look for</param>
/// <returns>The information instructing the middleware how it should behave</returns>
public AuthenticationResponseGrant LookupSignIn(string authenticationType)
{
if (authenticationType == null)
{
throw new ArgumentNullException("authenticationType");
}
AuthenticationResponseGrant grant = _context.Authentication.AuthenticationResponseGrant;
if (grant == null)
{
return null;
}
foreach (var claimsIdentity in grant.Principal.Identities)
{
if (string.Equals(authenticationType, claimsIdentity.AuthenticationType, StringComparison.Ordinal))
{
return new AuthenticationResponseGrant(claimsIdentity, grant.Properties ?? new AuthenticationProperties());
}
}
return null;
}