使用 Net Core Identity 保护 Angular 2 应用
Using Net Core Identity to secure an Angular 2 app
我不是安全专家,我刚刚开始使用 .net 核心身份,所以我对我目前计划将 .netcore/angular 2 应用程序放在一起的方式有些担忧。我想利用个人用户帐户的 .net 核心 Web 解决方案模板来处理用 Angular 2 编写的我的应用程序的身份验证流程。(另外:我的客户想要一个 .net 核心后端和一个 angular 2 个前端在同一个域中(无 CORS),这就是为什么解决方案是这样的)。
默认的设置方式运行良好。用户登录后,我 return 包含我的 angular 2 应用程序脚本和用于初始化应用程序的应用程序标签的部分视图。我的应用程序加载正常,如果用户尚未通过身份验证则无法访问它(当然除非他们以某种方式绕过 .net 核心身份安全)。它还允许我将 .net 安全应用于从服务器请求的模板视图(部分视图呈现)。
我的问题是
1) 您能否轻松配置 .net 核心身份以利用 jwt 令牌,以便我的 Angular 2 应用程序的 http 请求可以使用 Bearer Authorization?这是一个问题,因为如果他们真的按照需要 CORS 的方式进行,那么我将不得不将我的 .net 核心身份验证重新配置为某种承载令牌,我的 angular 2 应用程序可以使用它来使用令牌和适当地发送它。我不确定使用 .net 核心身份是否可以轻松配置为 return jwt 令牌(如果可能,请告诉我)。
2) 我还没有这样做,但是可以将 Angular2 的 http 服务配置为发出经过身份验证的请求(在同一域中),这些请求可以使用 .净核心身份安全?
理想情况下,我想配置 .net 核心身份,这样我仍然可以使用个人用户帐户模板,同时还通过让 .net 核心身份现在使用 jwt 承载令牌来提前计划 CORS 实施。
在此先感谢您的帮助。
您可以使用 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 中提供帮助。
我刚刚将我的 Vue.js 应用配置为针对我们的 .Net Core 2.1 使用 JWT 和 cookie 授权 API。
添加到 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)]
我不是安全专家,我刚刚开始使用 .net 核心身份,所以我对我目前计划将 .netcore/angular 2 应用程序放在一起的方式有些担忧。我想利用个人用户帐户的 .net 核心 Web 解决方案模板来处理用 Angular 2 编写的我的应用程序的身份验证流程。(另外:我的客户想要一个 .net 核心后端和一个 angular 2 个前端在同一个域中(无 CORS),这就是为什么解决方案是这样的)。
默认的设置方式运行良好。用户登录后,我 return 包含我的 angular 2 应用程序脚本和用于初始化应用程序的应用程序标签的部分视图。我的应用程序加载正常,如果用户尚未通过身份验证则无法访问它(当然除非他们以某种方式绕过 .net 核心身份安全)。它还允许我将 .net 安全应用于从服务器请求的模板视图(部分视图呈现)。
我的问题是
1) 您能否轻松配置 .net 核心身份以利用 jwt 令牌,以便我的 Angular 2 应用程序的 http 请求可以使用 Bearer Authorization?这是一个问题,因为如果他们真的按照需要 CORS 的方式进行,那么我将不得不将我的 .net 核心身份验证重新配置为某种承载令牌,我的 angular 2 应用程序可以使用它来使用令牌和适当地发送它。我不确定使用 .net 核心身份是否可以轻松配置为 return jwt 令牌(如果可能,请告诉我)。
2) 我还没有这样做,但是可以将 Angular2 的 http 服务配置为发出经过身份验证的请求(在同一域中),这些请求可以使用 .净核心身份安全?
理想情况下,我想配置 .net 核心身份,这样我仍然可以使用个人用户帐户模板,同时还通过让 .net 核心身份现在使用 jwt 承载令牌来提前计划 CORS 实施。
在此先感谢您的帮助。
您可以使用 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 中提供帮助。
我刚刚将我的 Vue.js 应用配置为针对我们的 .Net Core 2.1 使用 JWT 和 cookie 授权 API。
添加到 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)]