【问题标题】:ASP.NET Core 3+ JWT authenticationASP.NET Core 3+ JWT 身份验证
【发布时间】:2021-04-20 12:13:38
【问题描述】:

最近花了几天时间研究如何使用 JWT 身份验证和/或 OIDC 保护 ASP.NET Core Web API/Web 应用程序。

到目前为止,我一直无法找到两个(?)不同的中间件扩展(.AddOpenIdConnect.AddJwtBearer)的正确文档。通过谷歌搜索和实验,我得出了这样的假设:前者支持完整的 OIDC 舞蹈(验证、重定向到授权等,适用于 Web 应用程序),而后者仅用于 JWT 验证(更适合 API)。

我发现的文章都是秘籍,重点是如何为特定的 id 提供程序进行配置,例如 Azure 或 IdentityServer4,但我几乎没有发现任何真正深入研究这些组件的行为方式以及每个可配置选项如何影响它的文章行为。我的公司使用自己的 id 提供者进行身份验证和颁发 JWT 令牌,所以我发现的大多数食谱只提供偶尔的提示,而不是真正的理解。

我意识到文档必须存在,但除了 Microsoft 在 docs.microsoft.com 上提供的框架文档之外,我找不到任何其他内容。

非常感谢有关如何使用这两个中间件的更多详细信息;不是专门针对命名的 id 提供者,而是更一般地:

  • 我的假设是否正确,即.AddOpenIdConnect 执行 JWT 验证并支持 OIDC 舞蹈,自动重定向到授权机构、令牌颁发者等?
  • 中间件是否依赖于cookie auth;即我可以省略.AddCookie 设置吗?
  • 同时使用这两个中间件组件(.AddOpenIdConnect.AddJwtBearer)是否有意义?
  • 请描述每个组件的行为,以及选项如何影响该行为。
  • 必须指定哪些必需选项,哪些是可选选项?
  • 是否需要与 OAuth2“舞蹈”(通过事件)进行交互,还是仅用于调试和响应/重定向自定义?

【问题讨论】:

    标签: c# asp.net-core jwt openid-connect jwt-auth


    【解决方案1】:

    正如您所说,AddOpenIdConnect 负责 oauth 舞蹈,对用户进行身份验证并创建用户会话。它在内部处理所有事情,因此除非您需要自定义它,否则您不需要涉及事件。

    您通常将 AddOpenIdConnect 与 AddCookie 一起使用,以便 AddCookie 负责用户会话 cookie。 AddOpenIdConnect 仅用于用户登录流程的挑战部分。

    AddJwtBearer 仅用于接收和验证令牌的 API/服务,它只会对令牌进行验证并基于令牌创建 ClaimsPrincipal 用户。

    您可以在同一个服务中同时使用两者,但我建议您不要这样做,因为要弄清楚发生了什么会变得非常复杂。保持简单并遵循单一责任原则,您就可以开始了。 (即,将它们放在不同的服务中)

    典型的 AddJwtBearer 设置如下所示:

    .AddJwtBearer(opt =>
    {
        opt.Authority = "https://localhost:6001";
        opt.Audience = "paymentapi";
    
        opt.TokenValidationParameters.RoleClaimType = "roles";
        opt.TokenValidationParameters.NameClaimType = "name";
        opt.TokenValidationParameters.ClockSkew = TimeSpan.FromSeconds(0);
    
    
        // IdentityServer emits a typ header by default, recommended extra check
        opt.TokenValidationParameters.ValidTypes = new[] { "at+jwt" };
    });
    

    典型的 AddOpenIdConnect 设置如下所示:

        .AddOpenIdConnect(options =>
    {
        options.AccessDeniedPath = "/User/AccessDenied";
        options.Authority = _configuration["openid:authority"];
        options.ClientId = _configuration["openid:clientid"];
        options.ClientSecret = "mysecret";
        options.ResponseType = "code";
    
        options.Scope.Clear();
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("email");
        options.Scope.Add("employee");
        options.Scope.Add("payment");
        options.Scope.Add("offline_access");
    
        options.GetClaimsFromUserInfoEndpoint = true;
        options.SaveTokens = true;
        options.Prompt = "consent";
    
        options.TokenValidationParameters = new TokenValidationParameters
        {
            NameClaimType = JwtClaimTypes.Name,
        };
    
    
    });
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2019-09-06
      • 2020-05-20
      • 2018-09-02
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 2021-10-27
      • 2021-12-17
      相关资源
      最近更新 更多