如何在react native中使用ASP.NET Core后端进行身份验证/授权



我在MVC项目中实现了身份验证和授权https://metanit.com/sharp/aspnet5/15.1.php.我有一个允许身份验证和授权的帐户控制器:

public class AccountController : Controller
{
private UsersContext db;
public AccountController(UsersContext context)
{
db = context;
}
[HttpGet]
public IActionResult Login()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel model)
{
if (ModelState.IsValid)
{
User user = await db.Users.FirstOrDefaultAsync(u => u.PhoneNumber == model.PhoneNumber && u.Password == model.Password);
if (user != null)
{
await Authenticate(model.PhoneNumber); // аутентификация
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("", "Некорректные логин и(или) пароль");
}
return View(model);
}
[HttpGet]
public IActionResult Register()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(RegisterModel model)
{
if (ModelState.IsValid)
{
User user = await db.Users.FirstOrDefaultAsync(u => u.PhoneNumber == model.PhoneNumber);
if (user == null)
{
// добавляем пользователя в бд
db.Users.Add(new User { PhoneNumber = model.PhoneNumber, Password = model.Password });
await db.SaveChangesAsync();
await Authenticate(model.PhoneNumber); // аутентификация
return RedirectToAction("Index", "Home");
}
else
ModelState.AddModelError("", "Некорректные логин и(или) пароль");
}
return View(model);
}
private async Task Authenticate(string phone)
{
// создаем один claim
var claims = new List<Claim>
{
new Claim(ClaimsIdentity.DefaultNameClaimType, phone)
};
// создаем объект ClaimsIdentity
ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
// установка аутентификационных куки
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id));
}
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction("Login", "Account");
}
}

它正在Cookie中保存身份验证数据。它运行良好。在react原生应用程序中使用此功能的最佳方式是什么?

;使用ASP.NET核心";对你的问题没有太多说明。。。我的意思是:前端客户端和后端.net核心是不同的东西,一个不影响另一个。。。。由于您在服务器上使用cookie处理身份验证,因此在客户端上唯一要做的事情就是:

  1. 在auth-response上,读取cookie并将声明、名称、id、角色等保存在应用程序的状态中(查看此处(
  2. 确保所有请求也发送cookie(无论如何,默认情况下,所有浏览器都会发送cookie(
  3. 在应用程序内部路由时,请检查用户是否具有所需的声明

现在,由于您使用的是react应用程序,我建议您使用JWT代币,而不是cookie,这样您就可以在整个应用程序中强制执行无状态状态,cookie对此并不好。同样,如果你在哪里使用JWTs:

  1. 后端是一个单独的东西,您的调用将保持在API中,但它们将向调用方提供令牌等,而不是响应上的cookie
  2. 阅读JWT,将声明存储在应用程序状态中,并使用,例如路由,检查呼叫的身份验证/授权状态
  3. 确保在每个请求的标头中提供令牌,这通常是从应用程序手动完成的,浏览器不处理这部分通信

还有一个关键点:您是在构建SPA还是在构建mvc解决方案??你指出的指南围绕着一个mvc项目,你不应该遵循react应用程序的相同指导原则,这通常是一个spa。。。我建议你立刻看看这个!

在我看来,对于使用REST API的前端基于浏览器的应用程序,最常见的方法是使用基于令牌的身份验证,该身份验证依赖于OAuth 2.0协议来执行令牌的实际发行。此外,您应该将代币发行委托给第三方(如:IdentityServer4(,这样您就不需要实现或维护系统的这一部分,只需要使用/验证生成的代币。你可以查看以下文章:

SPAs 的认证和授权

在Identity Server 4 中使用SPA(React/Angular(UI

相关内容

最新更新