如何在没有IdentityServer或OAuth的情况下配置JWT STS

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

我想构建一个JWT安全令牌服务(.net core 2+),以便在不使用IdentityServer或OAuth的情况下为许多API(.net core 2+)提供身份验证和授权,因为我不需要重定向。

下图描述了该场景:

“JWT Authenticator”工作正常并且有路线

  • POST帐户:注册新用户
  • POST Auth / Login:如果凭据有效,则返回jwt令牌
  • POST令牌:刷新令牌
  • POST令牌/撤销:撤消令牌

但是,我很难提供步骤4和5.我在API1 / Startup.cs - > ConfigureServices上尝试了很多选项,但在调用GET API1 / Resource时无法获得任何结果,而是404。 ConfigureServices方法仍然是这样的:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        })
       .AddJwtBearer(options =>
       {
           options.Authority = "http://localhost:6000"; // JWT Authenticator address
           options.RequireHttpsMetadata = false;
           options.SaveToken = true;
           options.TokenValidationParameters = new TokenValidationParameters
           {    
               ValidIssuer = _configuration.GetValue<string>("JwtIssuer"),
               ValidAudience = _configuration.GetValue<string>("JwtAudience"),
               IssuerSigningKey = new SymmetricSecurityKey(
                   Encoding.UTF8.GetBytes(_configuration.GetValue<string>("JwtSecretKey"))),
               ClockSkew = TimeSpan.Zero
           };
       });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

是否可以使用AddJwtBearer等方法配置步骤4和5?如果没有,我该怎么办?使用API​​1的授权过滤器拦截请求并向JWT Authenticator发出请求以验证令牌/获取声明/等?

c# asp.net-core jwt asp.net-core-webapi sts-securitytokenservice
1个回答
0
投票

一些想法......

你的4和5路;通常你不会询问令牌的提供者是否有效。您所做的就是验证这一点,最有可能是签名,可以选择从提供商处下载哪些参数。

请注意细微差别:提供商本身不会检查它。

下一篇:ClockSkew = TimeSpan.Zero,这很少。我至少会给它一些松懈。

至少;有一个404表示找不到资源。它不是401403。这表明授权是成功的,但找不到请求的资源。


签名验证的典型实现:

请注意,这并不能解决您的问题。

options.TokenValidationParameters = new TokenValidationParameters
{
    IssuerSigningKeyResolver = (s, securityToken, identifier, parameters) =>
    {
        // get from provider 
        // todo: cache this
        var json = new WebClient().DownloadString(
             issuer + "/.well-known/jwks.json"); //typical endpoint

        // serialize the result
        var keys = JsonConvert.DeserializeObject<JsonWebKeySet>(json).Keys;
        // cast the result to be the type expected by IssuerSigningKeyResolver
        return (IEnumerable<SecurityKey>) keys;
    }
//...
© www.soinside.com 2019 - 2024. All rights reserved.