我有一个用.net core编写的web api和一个访问api上的方法的angular应用程序。我已经使用JWT身份验证保护了api,因此当应用程序首次启动时,它会登录到应用程序中,以获取JWT令牌来访问api。问题是我想锁定API上的某些方法,这样它们只能由SPA访问,而不能由第三方访问。如果我打开develper工具,我可以看到我的应用程序调用我的api来获取JWT令牌,但如何阻止其他人这样做并完全访问我的api?
使用JWT令牌可以将对应用程序的访问权限限制为特定受众,例如Angular SPA。为此,当您将身份验证添加到.net核心应用程序时,请在身份验证配置中定义目标受众,如下所示:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "JwtBearer";
options.DefaultChallengeScheme = "JwtBearer";
})
.AddJwtBearer("JwtBearer", jwtBearerOptions =>
{
jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true, // verify signature to avoid tampering
IssuerSigningKey =
new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(appSettings.Secret)),
ValidateIssuer = true,
ValidIssuer = appSettings.AppIssuer, // site that makes the token
ValidateAudience = true,
ValidAudience = appSettings.AppAudience, // site that consumes the token
ValidateLifetime = true, //validate the expiration
ClockSkew = System.TimeSpan.FromMinutes(0), // tolerance for the expiration date
};
});
如您所见,我将有关受众的信息存储在app.settings.json
文件中。假设你在http://localhost:4200
上运行你的角度SPA你现在可以配置你的应用程序。设置如下:
{
"AppSettings": {
"Secret": "secretKey",
"AppIssuer": "http://localhost:5000", //this is address of you web api
"AppAudience": "http://localhost:4200"
}
}
从现在起,所有不是来自http://localhost:4200
的请求都将是未经授权的。