.net核心API和Angular SPA

时间:2018-12-06 10:05:21

标签: angular api security asp.net-core-webapi

我有一个用.net核心编写的Web api和一个可访问API上的方法的角度应用程序。我已经通过JWT身份验证保护了api,因此当应用程序首次启动时,它将登录到应用程序中以获取JWT令牌来访问API。问题是我想锁定我API上的某些方法,以便它们只能由SPA而非第三方访问。如果我打开开发工具,可以看到我的应用程序调用我的api来获取JWT令牌,但是有什么方法可以阻止其他人这样做并完全访问我的API?

1 个答案:

答案 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的请求都将被未经授权。