Как хранить куки в идентичности asp.net (web api) - PullRequest
2 голосов
/ 15 апреля 2019

У меня есть проект веб-приложения Asp.net с учетной записью пользователя WebApi и частных лиц. Я реализовал Регистрация и вход в систему и использовал angularjs во внешнем интерфейсе.

Теперь мне нужно хранить куки в браузере.

Я запутался, если при проверке подлинности на основе файлов cookie файлы cookie хранятся в браузере?

В моем проекте я аутентифицирую пользователей на основе токена.

Я занимаюсь исследованиями, но меня это смущает, и я не нашел четкого руководства по хранению файлов cookie с помощью веб-приложения Asp.Net Identity.

Вот где аутентификация пользователя:

  public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }
       /* 
   I tried the following but I get an error that Request doesn't exist

 var claims = new List<Claim>();
        claims.Add(new Claim(ClaimTypes.Name, context.UserName));
        var id = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);

        var ctx = Request.GetOwinContext();
        var authenticationManager = ctx.Authentication;
        authenticationManager.SignIn(id);

                 */

        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager);
        ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager);

        AuthenticationProperties properties = CreateProperties(user.UserName);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }

Извините, я новичок в Asp.net.

Если в Asp.Net Identity в WebApi (не MVC) имеется четкое руководство?

Примечание: у меня нет LoginPath.

1 Ответ

0 голосов
/ 15 апреля 2019

Итак, у вас есть webApi, который вы используете для аутентификации ваших пользователей, и когда ваш пользователь проходит аутентификацию, вы получаете токен jwt, верно?и вам нужно сохранить этот токен в файле cookie, чтобы ваш клиентский интерфейс использовал его для выполнения запросов.

, так что здесь приведен пример кода, который я написал для этого, - asp core api в моем aspcore API AccountsController => Действие при входе:

    [HttpPost]
    public async Task<IActionResult> Login([FromBody] LoginViewModel vm)
    {
        if (ModelState.IsValid)
        {
            var token = await _authenticationService.GenerateToken(vm);
            if (token != null)
            {
                return Ok(new
                {
                    token = new JwtSecurityTokenHandler().WriteToken(token),
                    expiration = token.ValidTo
                });
            }
            return Unauthorized();
        }
        return StatusCode(StatusCodes.Status403Forbidden, new { ErrorMessage = "wrong Email or password" });
    }

_authenticationService - это класс, который я написал для generatae jwt token:

 public async Task<JwtSecurityToken> GenerateToken(LoginViewModel vm)
    {
        if (!string.IsNullOrEmpty(vm.Email) && !string.IsNullOrEmpty(vm.Password))
        {
            var user = await _userManager.FindByEmailAsync(vm.Email);
            var userRoles = await _userManager.GetRolesAsync(user);


            var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("Secrets:SigningKey").Value));
            var claims = new List<Claim>
            {
                 new Claim(JwtRegisteredClaimNames.Sub, vm.Email)
            };

            foreach (var roleName in userRoles)
            {
                claims.Add(new Claim(ClaimsIdentity.DefaultRoleClaimType, roleName));
            };


            if (user != null && await _userManager.CheckPasswordAsync(user, vm.Password))
            {
                var token = new JwtSecurityToken(
                        issuer: _configuration.GetSection("Secrets:issuer").Value,
                        audience: _configuration.GetSection("Secrets:audience").Value,
                        expires: DateTime.UtcNow.AddDays(20),
                        signingCredentials: new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256),
                        claims: claims);

                return token;
            }
            return null;
        }
        return null;
    }

, поэтому в приведенном выше коде вы отправляете хорошие учетные данные для вашего API.Вы получите обратно JWT токен.теперь вам нужно сохранить этот токен в cookie, для этого вам нужно создать cookie в вашем интерфейсе, а не в веб-интерфейсе API.

, поэтому вы можете увидеть эту ссылку в angular-university

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...