2017-03-02 102 views
0

目前,我使用下面的代碼集成Azure中的Active Directory到我的.NET Web API:在運行時集成的Windows Azure Active Directory的承載認證

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
    { 
     Audience = WebConfigurationManager.AppSettings["AzureClientId"], 
     Tenant = WebConfigurationManager.AppSettings["AzureTenant"] 
    } 
}); 

觀衆和租戶在web.config文件中設置。
我可以正確獲取令牌,並且用戶可以使用他們的azure AD帳戶登錄。
但是,我將觀衆和租戶移動到數據庫,以允許用戶通過UI更改設置並禁用/啓用天藍色登錄,而不是更改web.config中的設置。
上面的代碼更改爲:

var azureSetting = db.GetAzureSetting(); 
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
    { 
     Audience = azureSetting.AzureClientId, 
     Tenant = azureSetting.AzureTenant 
    } 
}); 

當第一次啓動應用程序,還有數據庫中沒有的配置,因爲用戶不輸入的配置呢。然後用戶轉到Azure配置屏幕,輸入正確的客戶端Id,租戶,客戶端密鑰。但用戶無法使用azure AD用戶登錄。
任何人都可以爲我解釋這種情況嗎?
有沒有什麼辦法可以在db而不是web.config中保存azure配置?

+0

把你的Azure的AD多租戶並添加自定義的邏輯來檢查令牌是否來自租戶ID存儲在數據庫 –

+0

我的問題是,用戶可以在應用程序之後運行時改變Azure的配置啓動,但是UseWindowsAzureActiveDirectoryBearerAuthentication不讀來自用戶的改變。它仍然使用StartUp.Auth.cs的第一個配置 –

+0

您能否提供您的建議樣本? –

回答

0

您的代碼在發佈後會在web API啓動時運行,並且我們無法更改配置運行時,如果您想讓用戶動態更改受衆和租戶,則可以自己處理令牌驗證。你可以使用JwtSecurityTokenHandler您的API應用程序後,驗證令牌獲得訪問令牌,下面的代碼是供你參考:

public JwtSecurityToken Validate(string token) 
    { 
     string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration"; 

     ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint); 

     OpenIdConnectConfiguration config = configManager.GetConfigurationAsync().Result; 

     TokenValidationParameters validationParameters = new TokenValidationParameters 
     { 
      ValidateAudience = true, 
      ValidateIssuer = false, 
      ValidAudience = "https://testbasic1.onmicrosoft.com/TodoListService", //your value from database 


      IssuerSigningTokens = config.SigningTokens, 
      ValidateLifetime = false 
     }; 

     JwtSecurityTokenHandler tokendHandler = new JwtSecurityTokenHandler(); 

     SecurityToken jwt; 

     var result = tokendHandler.ValidateToken(token, validationParameters, out jwt); 

     return jwt as JwtSecurityToken; 
    } 

這個處理程序可以幫助您驗證令牌的簽名,以確保該令牌是由Azure的主動發出目錄,並根據業務邏輯驗證令牌中的聲明,在您的方案中,您需要確認受衆和租戶。

在你的Web API的應用程序,你可以在Global.asax中註冊自定義TokenValidationHandler:

GlobalConfiguration.Configuration.MessageHandlers.Add(new TokenValidationHandler()); 

您可以點擊here的代碼示例,您可以修改代碼以檢查令牌是否來自租戶的id,這將存儲在數據庫中。

+0

嗨,您的解決方案在使用Azure Cloud驗證登錄時可以正常工作。 但是,我的應用程序支持Azure Cloud和本地帳戶登錄,當添加驗證代碼時,它將驗證來自Azure Cloud和本地登錄的所有令牌。 有沒有任何方法可以將令牌驗證應用於Azure雲中的唯一令牌? –

+0

您可以檢查訪問令牌的發行者,形成azure廣告1.0,發行者如下所示:https:// sts.windows.net/{tenant}/。您可以使用以下代碼從訪問令牌獲取發行者:var jwtTokenClaims = new JwtSecurityToken(jwtToken); var issuer = jwtTokenClaims.Issuer; –

+0

工作。非常感謝。 –

相關問題