我是 .Net Core(目前使用 .Net Core 2.2)授权和身份验证的新手。我必须在我的新项目中开发身份验证和授权机制。在网上搜索我发现了几种方法(使用身份、不使用、使用 Cookie、使用 JWT 等)。我希望有人为我指出一个非常适合我的场景的方向。以下是要求:
Login
端点收到用户和密码后,我将不得不请求此服务。然后,该服务将告诉我用户及其角色是否已通过身份验证。我对这里的很多东西都不熟悉。我不知道是否可以在服务器之间共享 cookie 身份验证,还是应该使用 JWT 并将其保存在数据库中……?另外,Session 在 .Net core 中是如何工作的?我可以以某种方式将会话绑定到 JWT 或类似的东西吗?
哪种方法是最好的/推荐的方法?
非常感谢任何帮助/教程。
谢谢!
只是一些概念:
Identity是一个用于帮助设置和管理用户群(如注册、验证密码、密码重置等)的库。它管理存储、安全性和许多必需的验证。这部分似乎由您的客户管理。所以你不需要这个。
Web 应用程序通常使用Cookie/会话来跟踪当前用户信息。虽然可以将这些与 Web API 一起使用,但实际上不推荐也不这样做。
JWT用于无状态设置。Web API 大多是无状态的(REST)。这意味着最小使用量或 RAM 而不是使用 RAM 或数据库来跟踪状态(以了解先前的请求是否与当前相关)。获取您的用户数据的 JWT,使用您可以提供的秘密字符串进行签名并创建签名。您可以在https://jwt.io等网站上在线阅读有关 JWT 的更多信息。
您的第一阶段是连接到客户端的系统进行身份验证。由于您打算连接到服务器端的另一个 API,您需要使用 .NET Core 的AddHttpClient
功能。首先,创建一个这样的类:
public class MyAuthClient
{
private readonly HttpClient httpClient;
public MyAuthClient(HttpClient httpClient)
{
this.httpClient = httpClient;
}
public Dictionary<string, string> AuthorizeUser(string username, string password)
{
// use the httpClient send login and get confirmation from client's system
if (loginFailed) return null;
else
{
var result = new Dictionary<string, string>();
result["userData1"] = "value"; // get these values from the http request you have created above.
}
}
}
在您的启动中添加以下内容:
services.AddHttpClient<MyAuthClient>(client => {
client.BaseAddress = new Uri("https://yourclientsystem.com");
});
现在,要设置 JWT 身份验证,您可以在网上找到多种方法。我已经建立了一个名为的库NetCore.Jwt
,它在这种情况下可能非常有用。如果您不习惯使用它,您可以提取其源代码或在线使用替代品。完成后,在您的 startup.cs 文件中:
在ConfigureServices
函数中使用以下内容:
services.AddAuthentication(NetCoreJwtDefaults.SchemeName).AddNetCoreJwt(options =>
{
options.Secret = "yourVerySecretKeyThatYouWillBeSharingBetweenBothServers";
// you can configure other options here too
});
以及Configure
函数中的以下内容:
app.UseAuthentication();
上面的代码使用 JWT 为您的应用程序配置身份验证。确保Secret
两个应用程序中的字符串相同将有助于确保您在两个应用程序之间共享相同的登录信息。在代码中硬编码这样的字符串是不安全的。检查此链接以了解如何以安全格式存储内容。现在,您将需要一个控制器和操作,您可以在其中获取用户登录信息并提供有效的 JWT。这将是这样设置的:
public class AuthController : Controller
{
private readonly MyAuthClient authClient;
public AuthController(MyAuthClient authClient)
{
this.authClient = authClient;
}
public ActionResult<string> Login(string userName, string password)
{
var result = authClient.AuthorizeUser(userName, password);
if (result == null) return BadRequest("invalid login");
var claims = new List<Claim>();
foreach (var r in result)
{
claims.Add(new Claim(r.Key, r.Value));
}
claims.Add(new Claim(ClaimTypes.Name, "usernameHere")); // this can be later accessed using User.Identity.Name
claims.Add(new Claim(ClaimTypes.NameIdentifier, "userId"));
string token = HttpContext.GenerateBearerToken(claims);
return token;
}
}
最后,要使您的 API 只能被授权和使用,请确保您包含[Authorize]
在每个控制器之上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句