簡體   English   中英

JWT 沒有數據庫訪問權限的不記名令牌授權,使用服務/存儲庫?

[英]JWT bearer token authorization with no database access, use service/repository?

我有一個帶有控制器服務存儲庫模式的 API。 我想實現 JWT 不記名令牌授權,所以我創建了一個AuthenticationController 我的應用程序的 rest 來自 controller,它調用調用存儲庫的服務。 但是,我沒有訪問數據庫進行身份驗證,我只是訪問配置數據,所以我只有一個 controller 並且沒有服務/存儲庫。 是否建議以這種方式實施,或者即使我沒有訪問數據庫以使其保持一致,還是包含服務/存儲庫更好?

這是我的AuthenticationController

[Route("api/Authentication")]
[ApiController]
public class AuthenticationController : ControllerBase
{
    protected readonly IConfiguration _config;
    public IConfiguration Configuration { get { return _config; } }

    public AuthenticationController(IConfiguration config)
    {
        _config = config;
    }

    [Route("Login")]
    [AllowAnonymous]
    [HttpPost]
    public IActionResult Login([FromBody] UserLogin userLogin)
    {
        var user = AuthenticateUser(userLogin);

        if (user != null)
        {
            var token = GenerateToken();
            return Ok(token);
        }

        return NotFound("User not found");
    }

    private UserModel AuthenticateUser(UserLogin userLogin)
    {
        UserModel user = new UserModel()
        {
            ClientID = _config["Claims:ClientID"],
            ClientSecret = _config["Claims:ClientSecret"]
        };

        if (user.ClientID == userLogin.ClientID && 
            user.ClientSecret == userLogin.ClientSecret)
        {
            return user;
        }

        return null;
    }

    private string GenerateToken()
    {
        var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
        var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

        var claims = new[]
        {
            new Claim("client_id", _config["Claims:ClientID"]),
            new Claim("client_secret", _config["Claims:ClientSecret"]),
            new Claim("grant_type", _config["Claims:GrantType"]),
            new Claim("scope", _config["Claims:Scope"]),
        };

        var token = new JwtSecurityToken(_config["Jwt:Issuer"],
                                         _config["Jwt:Audience"],
                                         claims,
                                         expires: DateTime.Now.AddMinutes(15),
                                         signingCredentials: credentials);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

這里當然不需要使用存儲庫。 您可以單獨創建服務。

您不必總是遵循服務/存儲庫模式,除非您確實需要這種抽象級別。

事實上,在許多情況下,您只需使用注入了 DbContext 的 IMediator 的 CommandHandlers 即可。 在這里閱讀更多: https://softwareengineering.stackexchange.com/a/220126

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM