.Net Core 身份验证和用户会话

Joã*_*hin 5 authentication authorization .net-core

我是 .Net Core 的新手(当前使用 .Net Core 2.2)授权和身份验证。我必须在我的新项目中开发身份验证和授权机制。在网上搜索时,我发现了几种方法(使用身份、不使用、使用 Cookie、使用 JWT 等)。我希望有人为我指出一些非常适合我的情况的方向。以下是要求:

  • 我正在将应用程序开发为 API。所以我需要保护我的端点。
  • 身份验证将由我的客户提供的第三部分系统完成。基本上,在我的端点收到用户和密码后Login,我将必须请求此服务。然后,该服务将告诉我用户是否经过身份验证及其角色。
  • 经过身份验证后,我将查询自己的数据库以获取有关用户的信息:其时区、语言等。我希望在会话中包含此信息,以便该用户发送到我的服务器的每个请求,我都会获得该语言例如,为了以正确的语言返回数据。
  • 该应用程序将部署在两台具有负载平衡的不同服务器上。登录一台服务器的用户应该在另一台服务器上有效(服务器必须以某种方式共享 cookie/令牌)。

我对这里很多东西都不熟悉。我不知道是否可以在服务器之间共享 cookie 身份验证,或者我应该使用 JWT 并将其保存在数据库中也许......?另外,Session在.Net core中是如何工作的?我可以以某种方式将会话绑定到 JWT 或类似的东西吗?

这里最好/推荐的方法是什么?

非常感谢任何帮助/教程。

谢谢!

Nev*_*ane 4

只是一些概念:

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.
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

在你的启动中添加以下内容:

services.AddHttpClient<MyAuthClient>(client => {
    client.BaseAddress = new Uri("https://yourclientsystem.com");
});
Run Code Online (Sandbox Code Playgroud)

现在,要设置 JWT 身份验证,您可以在网上找到多种方法。我已经建立了一个名为的库NetCore.Jwt,在这种情况下它可能非常有用。如果您不习惯使用它,您可以提取其源代码或在线使用替代方案。完成此操作后,在您的startup.cs文件中:

在函数中使用以下内容ConfigureServices

services.AddAuthentication(NetCoreJwtDefaults.SchemeName).AddNetCoreJwt(options => 
{
    options.Secret = "yourVerySecretKeyThatYouWillBeSharingBetweenBothServers";
   // you can configure other options here too
});
Run Code Online (Sandbox Code Playgroud)

以及函数中的以下内容Configure

app.UseAuthentication();
Run Code Online (Sandbox Code Playgroud)

上面的代码使用 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

最后,为了使您的 API 只能被授权和使用,请确保您将其包含[Authorize]在每个控制器之上。


归档时间:

查看次数:

2290 次

最近记录:

7 年,3 月 前