2017-04-15 130 views
4

我在我的asp網絡核心項目中通過令牌實現了WebAPI驗證,我在每次登錄時創建一個令牌,並且一切似乎都起作用。jwt令牌多租戶

我的問題是,應用程序將是多tanancy我,所以我會有很多的子域的客戶端 (Client1.myapp.com,client2.myapp.com,client3.myapp.com)

服務器端我管理蜜蜂的應用程序將接受一個參數,該參數將成爲租戶的姓名。 一些例子:

apimyapp.com/client1/api/generateToken

apimyapp.com/client2/api/generateToken

apimyapp.com/client3/api/generateToken

現在,如果我從client1創建令牌,並且我打電話給apimyapp.com/client2/api/users(在客戶端1生成的令牌中插入標頭,但是調用是爲客戶端2生成的)

我驗證令牌。

相反,我希望令牌只對生成它的租戶有效。

在我startup.cs:

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
     { 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
      TokenValidationParameters = new TokenValidationParameters() 
      { 
       ValidIssuer = _config["Tokens:Issuer"], 
       ValidAudience = _config["Tokens:Audience"], 
       ValidateIssuerSigningKey = true, 
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"])), 
       ValidateLifetime = true 
      } 
     }); 

,在我的控制器生成令牌:

var userClaims = _userManagerRepository.GetClaims(user); 

    var claims = new[] 
    { 
     new Claim(JwtRegisteredClaimNames.Sub, user.UserName), 
     new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), 
     new Claim(JwtRegisteredClaimNames.GivenName, user.UserName), 
     new Claim(JwtRegisteredClaimNames.FamilyName, user.UserName), 
     new Claim(JwtRegisteredClaimNames.Email, user.Email) 
    }.Union(userClaims); 

    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"])); 
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); 

    var token = new JwtSecurityToken(
     issuer: _config["Tokens:Issuer"], 
     audience: _config["Tokens:Audience"], 
     claims: claims, 
     expires: DateTime.UtcNow.AddMinutes(90), 
     signingCredentials: creds 
    ); 

回答

0

您可以在鍵添加列表,觀衆等這樣的TokenValidationParameters

ValidAudiences = new List<string> 
     { 
      "AUDIENCE1", 
      "AUDIENCE2" 
     }