.Net-在同一IIS上的两个webapi之间共享令牌

时间:2018-06-29 08:07:16

标签: .net asp.net-web-api2 bearer-token

我有一个基于Angular2的前端项目,一个.Net WebApi 2.0后端。

现在,我必须实现一个必须使用相同身份验证的并行项目。

我想做的是创建一个新的webapi 2.0,并在两个webapi之间共享令牌,以避免用户在项目之间切换时提供相同的用户名和密码。

有可能吗?

另一个解决方案是将相同的Webapi用于project2并扩展控制器/方法,但我想为其创建一个新项目。

感谢支持

2 个答案:

答案 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层公用层。