【问题标题】:JWT Same Application is the Auth Server and the Application ServerJWT Same Application 是 Auth Server 和 Application Server
【发布时间】:2020-01-08 21:45:54
【问题描述】:

各位专家,我最近对 ​​OAuth 以及 JWT 的工作原理进行了很多探索。本质上应该有一个发出令牌的AuthServer,并且应该有一个ServiceAPI(应用服务器)将令牌用于客户端!! .我也知道令牌由 3 部分组成,标头、有效负载和签名...

现在,如果我想构建一个 API,它既可以进行身份​​验证又可以发出 JWT 令牌,然后再提供服务。这听起来像是带有令牌的基本身份验证!!

我也不确定我编写的代码是否反映了这个概念(令牌发行者与 ServiceAPI 相同)。我正在按照this 文章构建一个 .net core 2.1 Web API。

在 Startup.cs 中

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        //Authentication
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(options =>
        {
            options.Authority = "https://localhost:44387/";
            options.Audience = "JWT:Issuer";
            options.TokenValidationParameters.ValidateLifetime = true;
            options.TokenValidationParameters.ClockSkew = TimeSpan.FromMinutes(5);
            options.RequireHttpsMetadata = false;
        });

        services.AddAuthorization(options =>
        {
            options.AddPolicy("GuidelineReader", p => {
                p.RequireClaim("[url]", "GuidelineReader");
            });
        });
    }

我还添加了一个 LoginController 来生成令牌并返回它...

[AllowAnonymous]
    [HttpPost]
    public IActionResult Login([FromBody]Application login)
    {
        IActionResult response = Unauthorized();
        var user = AuthenticateUser(login);

        if (user != null)
        {
            var tokenString = GenerateJSONWebToken(user);
            response = Ok(new { token = tokenString });
        }

        return response;
    }

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

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

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

下面有什么区别

  • options.Authority
  • options.Audience(我认为是发送https请求的应用程序)
  • options.Issuer

【问题讨论】:

    标签: oauth-2.0 asp.net-core-mvc jwt asp.net-core-webapi asp.net-core-2.1


    【解决方案1】:

    options.Authority

    Authority 是颁发令牌的认证服务器的地址。在您的场景中,web api 发出令牌,因此 Authority 将是 web api 的 url。

    options.Audience(我认为是发送https请求的应用程序)

    Audience 表示传入令牌的预期接收者或令牌授予访问权限的资源。在您的场景中,web api 是客户端将使用 JWT 令牌访问的受保护资源,web api 将验证令牌以检查声明/签名。所以 web api 名称/URL 应该是 Audience

    options.Issuer

    Issuer 标识构造和返回令牌的安全令牌服务 (STS)。在您的场景中,Web api 验证用户凭据并返回令牌。所以 web api 名称/URL 是 Issuer

    【讨论】:

    • 感谢您的回答...所以我认为我的代码编写正确?那么可能有多个 Audience,那我为什么要在那里指定 JWT:Issuer?
    • 该 api 将确认 jwt 令牌是由信任 STS 颁发的,因此它将验证颁发者声明。 multiple audience 是什么意思?
    • 多个我的意思是任何应用程序都可以向我的 API 发送一个 HTTPS Post/Get 请求..所以我如何提前知道谁是受众?在示例中,该值为 JWT:Issuer...不确定原因
    • @Samra 如果任何客户端使用 token 将请求(无论 get/post)发送到 web api,则受众是相同的 - webapi 的名称/url。如果要区分哪个客户端发送令牌,可以在令牌中包含一个名为clientID 的声明,以便 web api 知道哪个客户端发送请求。
    • 谢谢这清楚了!!。我实际上在想客户的名字/网址是观众。现在另一个问题是......我编写的代码意味着我的 webAPI 既是发行者又是服务提供商,还是我需要更改任何值来反映这一点?
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 2022-12-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多