使用Net Core Identity来保护Angular 2应用程序

时间:2016-10-18 14:44:07

标签: angular .net-core

我不是安全专家,而且我刚刚开始使用.net核心身份,所以我对目前计划将.netcore / angular 2应用程序放在一起的方式有些担忧。我想利用个人用户帐户的.net核心Web解决方案模板来处理我的应用程序的auth流程,这是用Angular 2编写的。(旁白:我的客户端想要一个.net核心后端和一个角度2前端在同一个域(没有CORS)这就是为什么解决方案是这样的)。

设置的默认方式是正常工作。用户登录后,我会返回一个部分视图,其中包含我的angular 2应用程序和app标签的脚本以初始化应用程序。我的应用程序加载正常,如果用户尚未进行身份验证,用户无法访问它(除非他们以某种方式绕过.net核心身份安全性)。它还允许我将.net安全性应用于从服务器请求的模板视图(部分视图呈现)。

我的问题是

1)您是否可以轻松配置.net核心身份以利用jwt令牌,以便我的Angular 2应用程序的http请求可以使用Bearer Authorization?这是一个值得关注的问题,因为如果它们确实采用了需要CORS的方式,那么我将不得不将我的.net核心身份验证重新配置为某种承载令牌,我的angular 2应用程序可以使用它来使用令牌并适当地发送它。我不确定是否可以轻松配置使用.net核心身份来返回jwt令牌(如果可以的话,请告诉我)。

2)我还没有做到这一点,但Angular2的http服务可以配置为使用.net在服务器上正确生成ClaimsPrincipal的经过身份验证的请求(在同一个域中)安全的核心身份?

理想情况下,我想配置.net核心身份,以便我仍然可以使用单个用户帐户模板,同时通过让.net核心身份现在使用jwt bearer令牌来提前计划CORS实施。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用IdentityServer4验证核心项目中的JWT。将IdentityServer4.AccessTokenValidation添加到project.json(不建议使用)或.csproj(新)。 然后,您可以通过键入Startup.Configure:

来使用IdentityServer4中间件
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            Authority = IssuerURL,
            // AllowedScopes = { "MyApp" },
            ScopeName= "MyApp"
        });

ScopeName是旧版本,较新版本是AllowedScopes。

这是用于检查令牌。

要生成令牌,请参阅IdentityServer4 Documentation

我无法帮助Angular。

答案 1 :(得分:0)

我刚刚将Vue.js应用配置为针对我们的.Net Core 2.1 API使用JWT和cookie授权。

添加到appsettings.json:

"Tokens": {
    "JwtKey": "0123456789ABCDEF",  //this sample key is insecure, change it
    "JwtIssuer": "http://yourdomain.com",
    "JwtExpireDays": "100"
},

添加到启动中:

using System.IdentityModel.Tokens.Jwt;

将此添加到您的startup.cs ConfigureServices方法:

// ===== Add Jwt Authentication ========
        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); // => remove default claims
        services
            .AddAuthentication(options =>
            {
                //  options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                //   options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                //  options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

            })
            .AddCookie(cfg => cfg.SlidingExpiration = true)
            .AddJwtBearer(cfg =>
            {
                cfg.RequireHttpsMetadata = false;
                cfg.SaveToken = true;
                cfg.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
                    ValidIssuer = Configuration["Tokens:Issuer"],
                    ValidAudience = Configuration["Tokens:Issuer"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])),
                    ClockSkew = TimeSpan.Zero // remove delay of token when expire
                };
            });

如果您希望将JWT用作默认方案,请取消注释上面的相应行

要创建JWT令牌(在登录或令牌请求时),您可以执行以下操作:

private object GenerateJwtToken(string email, IdentityUser user)
    {
        var claims = new List<Claim>
        {
            new Claim(JwtRegisteredClaimNames.Sub, email),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(ClaimTypes.NameIdentifier, user.Id)
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Tokens:JwtKey"]));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["Tokens:JwtExpireDays"]));

        var token = new JwtSecurityToken(
            _configuration["Tokens:JwtIssuer"],
            _configuration["Tokens:JwtIssuer"],
            claims,
            expires: expires,
            signingCredentials: creds
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }

并这样称呼它:

// Identity User (application user)  
            var appUser = _userManager.Users.SingleOrDefault(r => r.Email == model.Email);
            return Ok(GenerateJwtToken(model.Email, appUser));

像这样装饰您的API操作方法/控制器:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]