ASP.NET Core Secure Api

时间:2017-08-08 16:56:58

标签: asp.net-web-api asp.net-core asp.net-identity asp.net-core-webapi asp.net-core-identity

我有一个ASP.NET Core项目,它有一个用于移动设备的Web API(Xamarin)。 我想用ASP.NET核心身份来保护api,但问题是当我对设备进行身份验证并成功进行身份验证时,在另一个请求中它仍未经过身份验证:

[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并在设备登录后对其进行身份验证?

1 个答案:

答案 0 :(得分:0)

我知道现在已经很晚了,但我认为这个想法是token用户,并返回一个local storage/Sharedpreferences,然后保存到客户端(Xamarin Android / iOS){{1} }。然后,保存的令牌可用于subsequent Web 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调用。您可以研究:如何在Xamarin,OpenId中解码 JWT令牌 ..

让我知道它是怎么回事。