1

我構建一個非常緊密跟隨樣品指導多租戶MVC5應用:https://github.com/AzureADSamples/WebApp-MultiTenant-OpenIdConnect-DotNet/使用MVC授權與角色屬性使用Azure的活動目錄+ OWIN

我對認證Azure的Active Directory和有我自己的角色的名字,我的SecurityTokenvalidated活動期間注入的角色要求:

SecurityTokenValidated = (context) => 
        { 
         // retriever caller data from the incoming principal 
         string upn = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.Name).Value; 
         string tenantId = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value; 

         var databaseConnectionString = RoleEnvironment.GetConfigurationSettingValue("DatabaseConnectionString"); 

         AppAnalyzerUser appAnalyzerUser = null; 

         using (CloudContext dbContext = new CloudContext(databaseConnectionString)) 
         { 
          if (dbContext.Office365Accounts.FirstOrDefault(x => x.AzureTokenId == tenantId) == null) 
           throw new GeneralErrorException("Account not found", "The domain that you used to authenticate has not registered."); 

          appAnalyzerUser = (from au in dbContext.AppAnalyzerUsers 
           .Include(x => x.Roles) 
           where au.UserPrincipalName == upn && au.AzureTokenId == tenantId 
           select au).FirstOrDefault(); 

          if (appAnalyzerUser == null) 
           throw new AccountNotFoundException();         
         } 

         foreach (var role in appAnalyzerUser.Roles) 
         { 
          Claim roleClaim = new Claim(ClaimTypes.Role, role.RoleName); 
          context.AuthenticationTicket.Identity.AddClaim(roleClaim);         
         } 

         return Task.FromResult(0); 
        }, 

我裝修的一些方法與授權屬性是這樣的:

[Authorize(Roles = "SystemAdministrator"), HttpGet] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

並且authorize屬性正確檢測到用戶不在該角色中,並將它們發回Azure進行身份驗證。

但是,我看到用戶已經通過Azure AD的身份驗證並登錄到了該應用程序。他們沒有機會在Azure屏幕上選擇新的用戶帳戶來登錄。因此,當它將它們反彈回Azure AD時,Azure AD會說「您已經登錄」並將它們直接發送迴應用程序。 SecurityTokenValidated事件反覆激發,一遍又一遍。

但是用戶仍然沒有該方法所需的角色,因此他們會彈回到Azure進行身份驗證,顯然我們會陷入循環。

除了編寫我自己的Authorize屬性的實現,還有其他方法來解決這個問題嗎?

回答

2

不幸的是,你偶然發現了一個已知的[Authorize]問題。有關說明和可能的解決方案,請參閱https://github.com/aspnet/Mvc/issues/634 - 此時編寫自定義屬性可能是最簡化的解決方法。

+0

謝謝。我最終編寫了我自己的Authorize屬性的實現,該屬性拋出一個錯誤,我將它引導到一個解釋性視圖。 – ChrisW 2014-09-03 19:33:48