0

我有一个ASP.NET Core项目,它具有移动设备(Xamarin)的Web API。 我想,以确保与ASP.NET核心身份的API,但问题是,当我进行身份验证的设备和成功验证,在另一个请求它没有通过身份认证:ASP.NET Core安全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并使设备登录后进行身份验证?

+0

这是一个很好的开始:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/community –

回答

0

我知道这是晚了,但我认为这个想法是login用户,并返回一个token多数民众赞成然后保存到客户端的(Xamarin的Android/iOS版为您的情况)local storage/Sharedpreferences。保存的令牌可用于无需登录即可进行身份验证的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<[email protected]^: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令牌 ..

让我知道它是怎么回事。

+0

谢谢你的答案,我会试试看,并告诉你它是如何发展的。 – MohdLom

+0

好的,如果有帮助,您会将其标记为答案。如果您需要任何帮助,请告知 –

+0

您好,Felix,我做了您所写的内容,但知道如何使用令牌来请求API以及该方法应该如何处理它,在此先感谢 – MohdLom