同时使用 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 有效但我的令牌已过期,我想以“未经过身份验证”为由使请求失败。我怎样才能做到这一点?
使用基于策略的身份验证。在那里您可以检查当前是否ClaimsPrincipal
(context.User
) has 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)