.Net核心验证和用户会话

问题描述 投票:2回答:1

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

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

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

哪个是最佳/推荐的方法?

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

谢谢!

authentication .net-core authorization
1个回答
3
投票

只是一些概念:

Identity是一个库,用于帮助设置和管理用户群,如注册,验证密码,密码重置等。它管理存储,安全性和许多必需的验证。这部分似乎由您的客户管理。所以你不需要这个。

Cookie应用程序通常由Web应用程序用于跟踪当前用户信息。虽然可以将这些用于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字符串相同将有助于确保您在两个应用程序之间共享相同的登录。在代码中对这些字符串进行硬编码是不安全的。检查this link以了解如何以安全的格式存储内容。现在,您将需要一个控制器和操作,您可以在其中获取用户的登录信息并提供有效的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]

© www.soinside.com 2019 - 2024. All rights reserved.