ASP.NET 核心安全 Api
ASP.NET Core Secure Api
我有一个 ASP.NET 核心项目,其中有一个用于移动设备 (Xamarin) 的 Web API。
我想用 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);
}
需要对return数据进行授权的代码:
[HttpGet("{id}")]
[Authorize]
public async Task<IActionResult> Get(int id)
{
var b = _context.Books.FirstOrDefault(o => o.BookId == id);
return Ok(b);
}
我阅读了有关 token 和 jwt 的内容,但我不知道如何使用它们。知道如何保护 API 并在他们登录后对设备进行身份验证吗?
我知道已经晚了,但我认为这个想法是 login
用户,然后 return 一个 token
然后保存到客户端的(Xamarin Android/iOS对于你的情况)local storage/Sharedpreferences
。然后,保存的令牌可用于 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
};
}
然后您可以将此令牌保存在本地 storage/Sharedpreferences,并使用它来验证您的 API 调用。您可以研究:How to decode JWT token in Xamarin, OpenId..
告诉我进展如何。
我有一个 ASP.NET 核心项目,其中有一个用于移动设备 (Xamarin) 的 Web API。 我想用 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);
}
需要对return数据进行授权的代码:
[HttpGet("{id}")]
[Authorize]
public async Task<IActionResult> Get(int id)
{
var b = _context.Books.FirstOrDefault(o => o.BookId == id);
return Ok(b);
}
我阅读了有关 token 和 jwt 的内容,但我不知道如何使用它们。知道如何保护 API 并在他们登录后对设备进行身份验证吗?
我知道已经晚了,但我认为这个想法是 login
用户,然后 return 一个 token
然后保存到客户端的(Xamarin Android/iOS对于你的情况)local storage/Sharedpreferences
。然后,保存的令牌可用于 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
};
}
然后您可以将此令牌保存在本地 storage/Sharedpreferences,并使用它来验证您的 API 调用。您可以研究:How to decode JWT token in Xamarin, OpenId..
告诉我进展如何。