使用多种身份验证方法的ASP.NET Core

时间:2019-02-16 02:02:03

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

同时使用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;

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

2 个答案:

答案 0 :(得分: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());
                    });});

答案 1 :(得分:1)

使用基于策略的身份验证。在那里,您可以检查当前的ClaimsPrincipalcontext.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