Asp.net core 如何从单个服务端点发布和验证jwt?

Asp.net core 如何从单个服务端点发布和验证jwt?,asp.net-core,oauth-2.0,jwt,Asp.net Core,Oauth 2.0,Jwt,我已经成功地在Angular前端Web应用程序和.Net核心Web API后端(用于获取数据)之间连接了一个基于令牌的授权系统 现在,我想将JWT逻辑(生成和验证)整合到第三个WebAPI.Net核心项目中 如何将以下逻辑“移动”到单独的Web API中进行令牌验证 在Startup.cs: public void ConfigureServices(IServiceCollection services) { services.AddAuth

我已经成功地在Angular前端Web应用程序和.Net核心Web API后端(用于获取数据)之间连接了一个基于令牌的授权系统

现在,我想将JWT逻辑(生成和验证)整合到第三个WebAPI.Net核心项目中

如何将以下逻辑“移动”到单独的Web API中进行令牌验证

在Startup.cs:

  public void ConfigureServices(IServiceCollection services)
    {            
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,

                ValidateIssuer = true,
                ValidateAudience = true,

                ValidAudiences = new List<string> { "Audience1", "Audience2" },
                ValidIssuer = "Credit Card oAuth Web API",
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("superSecretKey@345"))

            };
        });                        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
        [Authorize (Roles = "Credit Card Administrator")]
    public ActionResult<string> Get(int id)
    {
        return "value";
    }
public void配置服务(IServiceCollection服务)
{            
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(选项=>
{
options.TokenValidationParameters=新的TokenValidationParameters
{
ValidateLifetime=true,
ValidateSuersigningKey=true,
validateisuer=true,
ValidateAudience=true,
Validudiences=新列表{“Audience1”、“Audience2”},
validisuser=“信用卡oAuth Web API”,
IssuerSigningKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(“superSecretKey@345"))
};
});services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
并且在控制器中:

  public void ConfigureServices(IServiceCollection services)
    {            
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,

                ValidateIssuer = true,
                ValidateAudience = true,

                ValidAudiences = new List<string> { "Audience1", "Audience2" },
                ValidIssuer = "Credit Card oAuth Web API",
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("superSecretKey@345"))

            };
        });                        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
        [Authorize (Roles = "Credit Card Administrator")]
    public ActionResult<string> Get(int id)
    {
        return "value";
    }
[授权(角色=“信用卡管理员”)]
公共操作结果获取(int-id)
{
返回“值”;
}
我想保留角色的逻辑(这是因为JWT中设置了如下声明):

var userClaims=new List()
{
新索赔(JwtRegisteredClaimNames.Sub,名称),
新索赔(JwtRegisteredClaimNames.Email,“用户。name@company.com"),
新索赔(JwtRegisteredClaimNames.GivenName,“用户名”),
新索赔(ClaimTypes.Role,“客户管理员”),
新索赔(ClaimTypes.Role,“信用卡管理员”),
新索赔(ClaimTypes.Role,“柜台管理员”)
};
//TODO:重构以下内容:从oAuth服务获取令牌(传入访问者和声明)
var secretKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(“superSecretKey@345"));
var signinCredentials=新的签名凭证(secretKey,SecurityAlgorithms.HmacSha256);
var tokenOptions=新的JwtSecurityToken(
发行人:“http://localhost:58726",
听众:“http://localhost:58726",
索赔:用户索赔,
过期:DateTime.Now.AddMinutes(20),
签名凭据:签名凭据
);
var tokenString=new JwtSecurityTokenHandler().WriteToken(tokenOptions);
我希望这是有意义的,并感谢任何帮助

如何将以下逻辑“移动”到单独的Web API中进行令牌验证

您要移动的逻辑是ASP.NET核心身份验证中间件的一部分,除其他外,该中间件具有以下职责

  • 从HTTP请求的
    Authorize
    头读取访问令牌(承载令牌)
  • 验证访问令牌
  • 将访问令牌的声明显示到
    Authorize
    属性 在这种情况下,访问令牌被编码为JWT

    听起来您希望在单独的服务器上执行步骤(2)。如果是这样,您可能正在寻找OAuth内省。


    GitHub上有一些。此外,问答还将帮助您为OAuth内省配置这些扩展

    不确定“想要将JWT逻辑(生成和验证)整合到第三个WebAPI.Net核心项目”是什么意思。您是否正在尝试设置一个作为不同web服务器运行的OpenAuth,或创建另一个在同一网站上运行的解决方案子项目?IdentityServer4正是这样做的。它分隔了您的身份验证服务器。@我认为您是正确的,我正在尝试创建一个将在另一台服务器上运行的oauth项目。我想将发送给数据控制器的JWT“传递”给宣誓服务进行验证。@Sasan谢谢。我将介绍Identity Server 4。这是框架还是第三方服务?谢谢Shaun。这似乎是我想做的。我希望誓言服务将接受JWT令牌进行验证,并且我现有的“数据”WebAPI项目将能够传递它。我很快检查了链接(还没有完全消化其中的内容),我没有看到任何对JWT的引用。。。但我保证我会很快读完的。这个“秘密”应该藏在哪里?它应该存放在两个地方吗?我有三个“项目”:OAuthWeb服务、Web应用程序(客户端)和Web API(数据来源)。这个秘密应该只存储在OAuthWeb服务器中吗?或者它应该同时存储在客户机和oAuth项目中?您具体指的是什么秘密?JWT中有一个用于加密凭据的秘密。它也是客户端和身份验证服务器之间共享的秘密。但是,在我的例子中,因为我控制了所有三个项目,所以我不确定这个秘密应该只存储在oAuth服务中还是存储在客户机中。据我所知,如果我们使用内省,那么只有授权服务器需要JWT秘密。验证/解密/解析JWT成为内省端点的工作。确认我在这里说的话不要相信我的话,因为我已经有一段时间没有深入研究内省了。