Безопасный API ASP.NET Core

У меня есть проект ASP.NET Core с веб-API для мобильных устройств (Xamarin). Я хочу защитить API с помощью удостоверения ASP.NET Core, но проблема в том, что когда я аутентифицирую устройство и успешно аутентифицирую, в другом запросе оно еще не аутентифицировано:

[HttpPost]
public async Task<IActionResult> Post([FromBody] LogIn l)
{
    var user = await userManager.FindByEmailAsync(l.username);

    if(user == null)
    {
        user = await userManager.FindByNameAsync(l.username);
    }

    if(user != null)
    {
        await signInManager.SignOutAsync();
        Microsoft.AspNetCore.Identity.SignInResult result = await signInManager.PasswordSignInAsync(user, l.password, false, false);

        if (result.Succeeded)
        {
            await signInManager.RememberTwoFactorClientAsync(user);

            return Ok("Success");
        }
    }

    return Ok(HttpStatusCode.BadRequest);
}

Код, который должен авторизовать возврат данных:

[HttpGet("{id}")]
[Authorize]
public async Task<IActionResult> Get(int id)
{
    var b = _context.Books.FirstOrDefault(o => o.BookId == id);
    return Ok(b);
}

Я читал о токене и jwt, но не знаю, как их использовать. Любая идея, как защитить API и аутентифицировать устройство после входа в систему?


comment
Вот хорошее начало: docs.microsoft.com/en-us /aspnet/core/security/authentication/   -  person Ruard van Elburg    schedule 08.08.2017


Ответы (1)


Я знаю, что уже поздно, но я думаю, что идея состоит в том, чтобы login пользователя вернуть token, который затем сохраняется на клиенте (Xamarin Android/iOS для вашего случая) local storage/Sharedpreferences. Сохраненный токен затем можно использовать для subsequent вызовов веб-API для проверки подлинности без необходимости входа в систему. Затем его можно очистить, когда пользователь выходит из системы. Для JWT вы можете реструктурировать функцию входа следующим образом:

var token = await GetJwtSecurityToken(user);
 return Ok(new
        {
         token = new JwtSecurityTokenHandler().WriteToken(token),
                expiration = token.ValidTo
        });

GetJwtSecurityToken() может выглядеть следующим образом в зависимости от ваших потребностей:

 private async Task<JwtSecurityToken> GetJwtSecurityToken(ApplicationUser user)
        {
            var userClaims = await _userManager.GetClaimsAsync(user);

            return new JwtSecurityToken(
                //issuer: "http://localhost:****/",                
                //audience: "http://localhost:****/",
                audience: "http://localhost:****/",
                claims: GetTokenClaims(user).Union(userClaims),//Combine user & claims
                //expires: DateTime.UtcNow.AddMinutes(10),
                signingCredentials: new SigningCredentials(new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes("x%u<-Q.@w^:qF]2Hz4")), SecurityAlgorithms.HmacSha256)
            );
        }

Функция GetTokenClaims() может выглядеть так:

private static IEnumerable<Claim> GetTokenClaims(ApplicationUser user)
    {
        return new List<Claim>
        {
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
        new Claim("UserName", user.UserName),
        new Claim("Email", user.Email),
        new Claim(JwtRegisteredClaimNames.Sub, user.Id),
        new Claim("FirstName", user.FirstName)
        //Other user info
        };
    } 

Затем вы можете сохранить этот токен в локальном хранилище/Sharedpreferences и использовать его для аутентификации вызовов API. Вы можете исследовать: как декодировать токен JWT в Xamarin, OpenId..

Дайте мне знать, как это происходит.

person Felix Too    schedule 11.08.2017
comment
Спасибо за ответ, попробую и расскажу как получилось. - person MohdLom; 13.08.2017
comment
Хорошо, вы отметите это как ответ, если это поможет. Дайте мне знать, если вам нужна помощь - person Felix Too; 13.08.2017
comment
Здравствуйте, Феликс, я сделал то, что вы пишете, но знаю, как использовать токен для запроса API и как метод должен его обрабатывать, заранее спасибо. - person MohdLom; 13.08.2017
comment
Спасибо, жду тебя, - person MohdLom; 14.08.2017