使用owin将jwt声明存储在cookie中

时间:2015-08-28 09:25:12

标签: c# asp.net asp-classic owin jwt

我在asp.net webforms和经典asp中有一些网站。我收到来自api网关的请求,处理登录并在标题中包含一个jwt标记。

在我的网站上,我使用Owin和JWTBearerAuthentication来验证jwt令牌并拒绝错误请求。 这项工作非常顺利。

现在,如果jwt有效,我必须计算其他自定义声明(例如从数据库中获取的角色)并将它们存储在cookie中,这样我就不必在每个请求中执行此操作。

当然,我需要在asp.net webforms和经典的asp站点中访问这些声明。

这是启动类,带有令牌验证方法

  [assembly: OwinStartup(typeof(WebForms.Startup))]
  namespace WebForms
  {
      public class Startup
      {
          public void Configuration(IAppBuilder app)
          {
              ConfigureTokenConsumption(app);
          }

          private void ConfigureTokenConsumption(IAppBuilder app)
          {
              //Read parameters in config file
              string issuer = ConfigurationManager.AppSettings["as:Issuer"];
              string audience = ConfigurationManager.AppSettings["as:Audience"];

              string certificat = ConfigurationManager.AppSettings["Certificat"];
              X509Certificate2 cert = new X509Certificate2();
              byte[] raw = GetBytes(certificat);
              cert.Import(raw);

              X509Store store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser);
              store.Open(OpenFlags.ReadOnly);

              //prepare token validation options
              var options = new JwtBearerAuthenticationOptions { AuthenticationMode = AuthenticationMode.Active };
              options.TokenValidationParameters = new TokenValidationParameters
              {
                  ValidAudiences = new[] { audience },
                  ValidIssuer = issuer,
                  IssuerSigningToken = new X509SecurityToken(cert),
                  RequireExpirationTime = true,
                  ValidateAudience = true,
                  ValidateLifetime = false,
                  ClockSkew = new TimeSpan(0)
              };

              //Add in owin pipeline
              app.UseJwtBearerAuthentication(options);
          }

          /// <summary>
          /// string to bytes conversion
          /// </summary>
          /// <param name="str"></param>
          private byte[] GetBytes(string str)
          {
              byte[] bytes = new byte[str.Length * sizeof(char)];
              Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
              return bytes;
          }
      }
  }

基本上,当jwt有效时,我必须获得自定义声明,并将它们添加到cookie中,除非cookie仍然可用。然后,我想在我的网站中以主体或身份找到所有声明。

我在网上搜索并找到了在登录页面中创建cookie的示例。由于我没有处理登录过程,因此我没有登录页面。我想我必须在管道中插入,但是如何?

我找到了像UseExternalSignInCookie和UseCookieAuthentication这样的东西,它的用途是什么?我应该使用哪一个?我可以挂钩自定义代码吗?

由于

0 个答案:

没有答案