【问题标题】:ASP.NET Core Using Multiple Authentication MethodsASP.NET Core 使用多种身份验证方法
【发布时间】:2019-07-10 04:17:11
【问题描述】:

同时使用 Cookie 身份验证中间件和 JWT 身份验证中间件。 当我登录用户时,我创建自定义声明并将它们附加到基于 cookie 的身份。我还从外部来源获得了一个 jwt 令牌,它有自己的声明(我使用这个令牌来访问外部资源)。 启用身份验证时,我的控制器类看起来像这样

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedController : Controller
// Requires the following imports:
// using Microsoft.AspNetCore.Authentication.Cookies;
// using Microsoft.AspNetCore.Authentication.JwtBearer;
private const string AuthSchemes =
    CookieAuthenticationDefaults.AuthenticationScheme + "," +
    JwtBearerDefaults.AuthenticationScheme;

根据上面的代码 sn-p,如果 Cookie 或 JWT 验证成功,则请求被视为已验证。如果 Cookie Auth 或 JWT auth 失败,我的要求是拒绝该请求。对于我的情况,只使用一个模式不是一个好的选择。如果我的 cookie 有效但我的令牌已过期,我想以“未通过身份验证”为由使请求失败。我该怎么做?

【问题讨论】:

    标签: security authentication cookies asp.net-core jwt


    【解决方案1】:

    使用基于策略的身份验证。在那里您可以检查当前的ClaimsPrincipal (context.User) 是否有 2 个Identities,每个成功通过的身份验证方案中都有 1 个。配置策略

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAllSchemes", policy =>
        {
            policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);
            policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
            policy.RequireAuthenticatedUser();
            policy.RequireAssertion(context =>
            {
                return context.User.Identities.Count() == 2;
            });
        });
    });
    

    为控制器指定授权策略

    [Authorize(Policy = "RequireAllSchemes")]
    public class MixedController : Controller
    

    【讨论】:

    • 谢谢亚历山大。我确实尝试过这种方法。不幸的是,行为与我使用逗号分隔的方案时相同。这让我感到惊讶,因为我的印象是,当 [Authorize] 过滤器失败时,它会使 mvc 过滤器管道短路。在我的情况下,当我有一个无效的 jwt(过期)和一个有效的 Cookie - 我仍然可以访问路由。
    • @Jonathan 我已经更新(并且这次测试了)我的答案。请尝试一下。
    • @Jonathan 您还需要为 jwt 实现过期验证,因为它可能被认为是有效的并通过身份验证。
    • 非常感谢。这对我有用。是的,我确实有到期验证。我还喜欢您将解决方案封装在策略中的方式——它确实有助于提高可重用性。
    【解决方案2】:

    另一种方法

       services.AddAuthorization(options => {
                        options.AddPolicy(Policies.Users, policy => {
                            policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme); 
                            policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme)
                            policy.RequireAuthenticatedUser(); 
                            policy.RequireClaim(JwtClaimTypes.Scope, ResourceNames.IdentityUsers);
                            policy.RequireClaim(BasicClaimTypes.Admin, bool.TrueString.ToLower());
                        });});
    

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 2019-08-31
      • 1970-01-01
      • 2022-01-04
      • 2017-10-03
      • 2022-07-27
      • 2018-02-23
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多