我有一个用.net核心编写的Web api和一个可访问API上的方法的角度应用程序。我已经通过JWT身份验证保护了api,因此当应用程序首次启动时,它将登录到应用程序中以获取JWT令牌来访问API。问题是我想锁定我API上的某些方法,以便它们只能由SPA而非第三方访问。如果我打开开发工具,可以看到我的应用程序调用我的api来获取JWT令牌,但是有什么方法可以阻止其他人这样做并完全访问我的API?
答案 0 :(得分:0)
使用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
现在,您可以像这样配置app.settings:
{
"AppSettings": {
"Secret": "secretKey",
"AppIssuer": "http://localhost:5000", //this is address of you web api
"AppAudience": "http://localhost:4200"
}
}
从现在开始,所有来自http://localhost:4200
的请求都将被未经授权。