我有一个基于Angular2的前端项目,一个.Net WebApi 2.0后端。
现在,我必须实现一个必须使用相同身份验证的并行项目。
我想做的是创建一个新的webapi 2.0,并在两个webapi之间共享令牌,以避免用户在项目之间切换时提供相同的用户名和密码。
有可能吗?
另一个解决方案是将相同的Webapi用于project2并扩展控制器/方法,但我想为其创建一个新项目。
感谢支持
答案 0 :(得分:1)
如果两个API上的JWT签名密钥相同,并且您关闭了验证颁发者,则令牌将在两个API上都可以使用。
示例
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false, //this needs to be false
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ClockSkew = TimeSpan.Zero,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("fjboJU3s7rw2Oafzum5fBxZoZ5jihQRbpBZcxZFd/gY="))
};
});
创建一些声明(角色只是字符串列表)
public List<Claim> CreateJwtClaims( String UserId, List<String> Roles)
{
// create a list of claims and add userId
var Claims = new List<Claim>
{
new Claim(ClaimTypes.Name, UserId)
};
// add roles to the claims list
// for every role add a new claim type role
foreach (var role in Roles)
{
Claims.Add(new Claim(ClaimTypes.Role, role));
}
return Claims;
}
创建通过声明的令牌
public string CreateToken(List<Claim> Claims)
{
// JWT Key must be the same as in startup
string JwtSigningKey = "fjboJU3s7rw2Oafzum5fBxZoZ5jihQRbpBZcxZFd/gY=";
// create a security key
var Key = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(JwtSigningKey));
// sign the key using specified algorithm
var Creds = new SigningCredentials(Key, SecurityAlgorithms.HmacSha256);
// create the token from the signed credentials
var Token = new JwtSecurityToken(
issuer: "localhost", // or try setting issues the the same from both
audience: "localhost",
claims:Claims // passed claims
expires: DateTime.Now.AddMinutes(10), //expires in 10 mins
signingCredentials: Creds);
return new JwtSecurityTokenHandler().WriteToken(Token);
}
在您的控制器中添加授权
[Authorize] // this says you must have a valid token
// [Authorize(Roles = "admin")] and must be in role admin created in claims
[Route("api/[controller]")]
public class ValuesController : Controller
答案 1 :(得分:0)
好吧,如果将应用程序托管在2个不同的环境中,它将被视为2个不同的应用程序,但是引入了Load Balancer来处理多个环境。
关于.net: Proc会话是您应该寻找的会话,这两个Web应用程序都需要一个公共层来保存令牌,它可以是DB,Shared File等,但是必须是公共层。
每次将特定的参数集传递给它时,我可以使用的其他方法来生成相同的令牌
使用这两种方法时,您必须制作一个1层公用层。