【发布时间】:2020-05-04 06:23:26
【问题描述】:
我正在尝试在 .net core 2.2 中使用 JSON Web Token JWT 构建我自己的自定义授权属性。
我正在使用 Postman 调用授权 API,我在这里遇到了两个问题:
- 发送的
JWT中的声明未收到 -
IsAuthenticated属性在User.Identity.IsAuthenticated中始终为 false。
请注意,JWT 的部分工作正常,JWT 正在按照我想要的正确Claims 创建,我已经在https://jwt.io 上进行了检查。
至于我的Startup.cs,我正在使用app.UseAuthentication()
这是我将JWTAuthentication 添加到services 的方法:
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x=>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = true,
ValidateAudience = false
};
});
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppIdentityDbContext>()
.AddDefaultTokenProviders();
这是MyCustomAuthorizationAttribute.cs的sn-p
public string Permissions { get; set; } //Permission string to get from controller
public void OnAuthorization(AuthorizationFilterContext context)
{
//Validate if any permissions are passed when using attribute at controller or action level
if (string.IsNullOrEmpty(Permissions))
{
//Validation cannot take place without any permissions so returning unauthorized
context.Result = new UnauthorizedResult();
return;
}
//The below line can be used if you are reading permissions from token
var permissionsFromToken = context.HttpContext.User.Claims.Where(x => x.Type == "Permissions").Select(x => x.Value).ToList();
var requiredPermissions = Permissions.Split(','); //Multiple permissiosn can be received from controller, delimiter "," is used to get individual values
foreach (var x in requiredPermissions)
{
if (permissionsFromToken.Contains(x))
return; //User Authorized. Wihtout setting any result value and just returning is sufficent for authorizing user
}
context.Result = new UnauthorizedResult();
return;
}
注意:我知道这个问题以前被问过很多次,但我尝试了其中的大部分,但对我没有任何帮助。
【问题讨论】:
-
您是如何在
MyCustomAuthorizationAttribute中获得Permissions的?请注意,您需要设置ValidateIssuer和ValidateAudience。并确保您已添加类型为@987654341 的声明@.参考:stackoverflow.com/a/58163087/11398810 -
是的,您提到的所有内容都已经存在,但令人惊讶的是,问题只是在
Startup.cs中订购中间件,并且权限是根据登录的用户从数据库中获取的。
标签: asp.net-core .net-core jwt