用户使用身份验证方案的策略中缺少身份

塔马斯·萨博

我创建了一个使用2种身份验证类型的ASP.NET Core 3.1应用程序-cookie和JWT承载。

我已经建立了一个方案,该方案根据请求的路径将用户重定向到适当的方案:

.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultScheme = "smart";
    sharedOptions.DefaultChallengeScheme = "smart";
})
.AddPolicyScheme("smart", "Bearer Authorization or Cookie", options =>
{
    options.ForwardDefaultSelector = context =>
    {
        var requestPath = context.Request.Path;

        if (CookiePolicyPathRegex.IsMatch(requestPath))
        {
            return CookieAuthenticationDefaults.AuthenticationScheme;
        }

        return JwtBearerDefaults.AuthenticationScheme;
    };
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOAuthServiceScheme(Configuration); // Custom handler for JWT

我像这样设置授权策略:

options.AddPolicy(ApiPolicies.CookiePolicy, policy =>
{
    // policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);
    policy.RequireAuthenticatedUser();
    policy.RequireRole(Roles.Access);
});

options.AddPolicy(ApiPolicies.JwtPolicy, policy =>
{
    policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
    policy.RequireAuthenticatedUser();
});

效果很好,正在触发适当的策略,但是我有一个问题。在集成测试中,我使用一种中间件,该中间件为Cookie身份验证添加了ClaimsIdentity:

public async Task Invoke(HttpContext context)
{
    //  Removed for brevity

    var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

    context.User = new ClaimsPrincipal(claimsIdentity);

    await _next(context);
}

中间件设置为在Auth中间件之前运行

ConfigureAdditionalMiddleware(app);

app.UseAuthentication();
app.UseAuthorization();

如果我// policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);从cookie策略中取消注释该部分,那么授权部分将看不到在中间件中创建的身份。如果我对此置评,则身份在那里,包含声明,身份验证类型和所有内容。如果我查看转发到两个身份验证方案的PolicyScheme,则身份就在那里。

我的问题是,为什么添加CookieAuthenticationDefaults.AuthenticationScheme某种方式会隐藏使用相同身份验证类型创建的用户身份?

迈克尔·施特伦伯格

授权中间件将评估您的策略并运行将覆盖用户的身份验证逻辑。

这是相关的代码片段(我删除并简化了代码以突出显示相关部分):

public virtual async Task<AuthenticateResult> AuthenticateAsync(AuthorizationPolicy policy, HttpContext context)
{
    if (policy.AuthenticationSchemes != null && policy.AuthenticationSchemes.Count > 0)
    {
        var newPrincipal = await context.AuthenticateAsync(scheme).Principal;

        if (newPrincipal != null)
        {
            context.User = newPrincipal;
            return AuthenticateResult.Success(new AuthenticationTicket(newPrincipal, string.Join(";", policy.AuthenticationSchemes)));
        }
        else
        {
            context.User = new ClaimsPrincipal(new ClaimsIdentity());
            return AuthenticateResult.NoResult();
        }
    }
    ...
}

因此,如您所见,在为策略定义方案时,然后输入“ if”语句(它将设置一个new context.User,并且如果您注释该行,则身份验证逻辑将不会运行,并且您的自定义用户对象将在那里

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用什么身份验证策略?

来自分类Dev

Rails中的基本用户身份验证

来自分类Dev

Rails API中的用户身份验证

来自分类Dev

CodeIgniter中的用户身份验证

来自分类Dev

如何在pam策略中为不同的用户或组设置不同的身份验证要求?

来自分类Dev

如何在 pam 策略中为不同的用户或组设置不同的身份验证要求?

来自分类Dev

使用AsyncTask的用户身份验证

来自分类Dev

使用 Bcrypt 进行用户身份验证

来自分类Dev

使用 Python 的 aws 用户身份验证

来自分类Dev

使用 Firebase 检查用户身份验证

来自分类Dev

使用声明身份验证用户到系统的身份

来自分类Dev

如何使用Cognito身份验证我的身份/用户池?

来自分类Dev

使用ASP身份的会话和用户身份验证

来自分类Dev

S3存储桶策略-使用“任何经过身份验证的用户”还是存储桶策略?

来自分类Dev

hapi.js身份验证方案中使用了哪些身份验证工件?

来自分类Dev

如何使用Google身份验证器在Ubuntu中为Ubuntu用户设置两因素身份验证?

来自分类Dev

如何使用Google身份验证器在Ubuntu中为Ubuntu用户设置两因素身份验证?

来自分类Dev

仅在完全身份验证后,如何强制已身份验证的用户使用Symfony2中的HTTPS?

来自分类Dev

在Asp.net core / 5中使用策略库进行令牌身份验证

来自分类Dev

如何在代码中而不是使用AuthorizeAttribute检查ASP.NET身份验证策略?

来自分类Dev

用户身份验证错误

来自分类Dev

Android中的物理身份验证替代方案

来自分类Dev

身份验证-仅允许使用HTTPS方案

来自分类Dev

Next.js身份验证策略

来自分类Dev

未知身份验证Facebook策略-PassportJS

来自分类Dev

未知的身份验证策略“github”

来自分类Dev

FileZilla中缺少选项:密钥文件身份验证

来自分类Dev

Django 在“身份验证”应用程序中缺少迁移

来自分类Dev

在ASP.NET Core 3.1中使用多种身份验证方案?

Related 相关文章

  1. 1

    使用什么身份验证策略?

  2. 2

    Rails中的基本用户身份验证

  3. 3

    Rails API中的用户身份验证

  4. 4

    CodeIgniter中的用户身份验证

  5. 5

    如何在pam策略中为不同的用户或组设置不同的身份验证要求?

  6. 6

    如何在 pam 策略中为不同的用户或组设置不同的身份验证要求?

  7. 7

    使用AsyncTask的用户身份验证

  8. 8

    使用 Bcrypt 进行用户身份验证

  9. 9

    使用 Python 的 aws 用户身份验证

  10. 10

    使用 Firebase 检查用户身份验证

  11. 11

    使用声明身份验证用户到系统的身份

  12. 12

    如何使用Cognito身份验证我的身份/用户池?

  13. 13

    使用ASP身份的会话和用户身份验证

  14. 14

    S3存储桶策略-使用“任何经过身份验证的用户”还是存储桶策略?

  15. 15

    hapi.js身份验证方案中使用了哪些身份验证工件?

  16. 16

    如何使用Google身份验证器在Ubuntu中为Ubuntu用户设置两因素身份验证?

  17. 17

    如何使用Google身份验证器在Ubuntu中为Ubuntu用户设置两因素身份验证?

  18. 18

    仅在完全身份验证后,如何强制已身份验证的用户使用Symfony2中的HTTPS?

  19. 19

    在Asp.net core / 5中使用策略库进行令牌身份验证

  20. 20

    如何在代码中而不是使用AuthorizeAttribute检查ASP.NET身份验证策略?

  21. 21

    用户身份验证错误

  22. 22

    Android中的物理身份验证替代方案

  23. 23

    身份验证-仅允许使用HTTPS方案

  24. 24

    Next.js身份验证策略

  25. 25

    未知身份验证Facebook策略-PassportJS

  26. 26

    未知的身份验证策略“github”

  27. 27

    FileZilla中缺少选项:密钥文件身份验证

  28. 28

    Django 在“身份验证”应用程序中缺少迁移

  29. 29

    在ASP.NET Core 3.1中使用多种身份验证方案?

热门标签

归档