Аутентификация Оуэна не испускает куки

У меня есть следующие действия в контроллере входа. В целях тестирования я не использую форму входа в действие 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 ответа

Решение

Вы должны установить ClaimsIdentityAuthenticationType так же, как 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;
        }
Другие вопросы по тегам