我構建一個非常緊密跟隨樣品指導多租戶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屬性的實現,還有其他方法來解決這個問題嗎?
謝謝。我最終編寫了我自己的Authorize屬性的實現,該屬性拋出一個錯誤,我將它引導到一個解釋性視圖。 – ChrisW 2014-09-03 19:33:48