当前位置: 首页 > 知识库问答 >
问题:

Jwt与新客户

阳英朗
2023-03-14

我已经实现了JWT身份验证

我在启动文件中有类似的功能

public void ConfigureOAuth(IAppBuilder app)
        {
            var issuer = "http://jwtauthzsrv.azurewebsites.net";
            //var audience = "fd9eeeb25b694ff1bfd2260cf0d665c3";
            //var secret = TextEncodings.Base64Url.Decode("ixioSD5UPMMfGFUvxfblU3elZAnUvtoleVI0qu_7SrI");
            List<string> secret = new List<string>();
            List<string> audience = new List<string>();

            secret.Add(Convert.ToBase64String(TextEncodings.Base64Url.Decode("adFu3IhHjNibtVzy7Uon7l9CQE97XQ8YOKnLzLWlb1s")));
            //secret.Add(Convert.ToBase64String(TextEncodings.Base64Url.Decode("YqnwwJFI6HTQheAGvHI9ycuhgRmkpJDgOQDkDnahG2I")));
            // secretkeys.Add(TextEncodings.Base64Url.Decode("YqnwwJFI6HTQheAGvHI9ycuhgRmkpJDgOQDkDnahG2I").ToString());
            audience.Add("746b0e9e0bb44bfda086bc7f03f427c5");
           // audience.Add("7ef27cd3397d41e4848c3a85cca9e737");





            // Api controllers with an [Authorize] attribute will be validated with JWT
            app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions
                {
                    AuthenticationMode = AuthenticationMode.Active,
                    AllowedAudiences =  audience.AsEnumerable(),//new[] { audience },
                    //AllowedAudiences = new[] { audience },
                    IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                    {
                        new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
                        //new SymmetricKeyIssuerSecurityTokenProvider(issuer,secret.AsEnumerable())
                    },
                    Provider = new OAuthBearerAuthenticationProvider
                    {
                        OnValidateIdentity = context =>
                        {
                            context.Ticket.Identity.AddClaim(new System.Security.Claims.Claim("newCustomClaim", "newValue"));
                            return Task.FromResult<object>(null);
                        }
                    }
                });

        }

我假设,每当调用带有authorize属性的api时,它都应该调用ConfigureOAuth,以便从数据库加载所有cient id并通过jwt进行验证,但在调试时,我看到启动文件仅在运行应用程序时运行,

如何在调用任何api时调用ConfigureOAuth函数,以便加载新的clientid并进行验证。

使现代化

app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions
                {
                    AuthenticationMode = AuthenticationMode.Active,
                    AllowedAudiences =  select from database),

当我发布和部署项目时,上面的行只被初始化一次,而不是在进行新的api调用时。

如果创建了新用户,则会出现问题,新用户的id不会进入允许的受众

谢谢

共有1个答案

陶腾
2023-03-14

ConfigureOAuth应该在启动时只运行一次,因此行为是正确的。

使用应用程序。使用jwtbearerauthentication可以向请求管道中添加用于身份验证的中间件。您已经将允许的访问群体添加到配置中,因此在处理修饰的api期间不会再次加载该访问群体。然后,中间件将检查请求中是否存在授权标头,并检查提供的JWT是否有效,以及访问群体是否与配置的访问群体匹配。

响应您的更新更新:

如果创建了新用户,则会出现问题,新用户的id不会进入允许的受众

“受众”不是用户,而是可以使用令牌的资源服务器,另请参阅此处:JWT(Json Web令牌)受众“aud”与Client_Id-有什么区别?

而且,当您处理一个用[授权]修饰的请求时,用户身份验证不会发生,但当用户在令牌endpoint请求令牌时,用户身份验证已经发生得更早了。JWT auth中间件将只检查它在请求的授权标头中找到的令牌是否具有与AllowedAudions匹配的aud值。但此时,用户已经通过身份验证。

访问用户数据库的位置将位于不同的类中,例如

public class MyAuthProvider : OAuthAuthorizationServerProvider
{
    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
    if(Authenticate(context.UserName, context.Password))
        ...
    }
}

这就是您对用户进行身份验证、向JWT添加声明并最终创建JWT令牌的地方。

我建议阅读Taiseer Joudehs的博客:http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/

 类似资料:
  • 我使用这个库Aut0JavaJWT实现了JSON Web令牌,用于使用Spring框架的REST API。 这是密码 只要我使用HTTPS,我的JWT安全吗?我应该使用有效期吗?

  • 我正在构建一个移动应用程序,并且正在使用JWT进行身份验证。 最好的方法似乎是将JWT访问令牌与刷新令牌配对,这样我就可以根据需要频繁地使访问令牌过期。 刷新令牌是什么样子的?是随机字符串吗?那串加密了吗?是另一个JWT吗? 刷新令牌将存储在用户模型的数据库中以便访问,对吗?在这种情况下似乎应该加密 在用户登录后,我是否会将刷新令牌发送回,然后让客户端访问单独的路由来检索访问令牌?

  • 我正在开发一个网站,在cookies中存储JWT令牌。我想做的是,创建Javascript来解码令牌并提取我需要的值,然后将其传递给我的同事编写的另一个Javascript。我的问题是,是否有可以从脚本导入的用于JWT令牌解码的客户端javascript库?

  • 我读了很多关于JWT的书,以及如何通过JWT创建“无状态”会话。我理解的要点是因为签名 我不明白的是,如果您的用户需要注销,或者您需要在过期之前使会话无效,会发生什么情况? 从技术上讲,您可以指示浏览器从客户端删除它,但您不能确定这是否真的发生了。令牌本身在技术上仍然有效,如果没有遵循您的删除说明,它仍然可以使用。 这种理解正确吗?如果是这样,这难道不是客户端会话管理的一个巨大错误吗?除了让服务器

  • 我是JWT新手,我只是将其作为JSON中的java对象返回,并制作了一些过滤器,以便它可以像Spring Security中的session_id一样工作。 但是我不明白JWT是如何存储在客户端的,在服务器响应之后它会去哪里?它是否由coockies中的所有浏览器自动存储?所有浏览器都支持JWT吗? 我很感激你的回答。

  • 我正在使用Tymon提供的包来处理从我的laravel后端到spa前端的Auth,我正在创建AuthController,这几乎是我从文档中获取的,只是稍微调整一下它以满足我的需要。从登录到注销以及令牌过期,一切正常。 问题是,我确实看到该控制器上有一个令牌刷新功能,如果我的猜测是正确的,那就是刷新客户端已经拥有的当前令牌。但是怎么做呢?如何处理前端上的刷新令牌?因为它是相当烦人的,每60分钟(默