gpt4 book ai didi

azure - 将 MVC 授权属性与使用 Azure Active Directory + OWIN 的角色结合使用

转载 作者:行者123 更新时间:2023-12-02 06:34:40 24 4
gpt4 key购买 nike

我正在构建一个 Multi-Tenancy MVC5 应用程序,该应用程序非常严格地遵循示例指南:https://github.com/AzureADSamples/WebApp-MultiTenant-OpenIdConnect-DotNet/

我正在针对 Azure Active Directory 进行身份验证,并拥有自己的角色名称,我在 SecurityTokenvalidated 事件期间将其作为角色声明注入(inject):

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 属性修饰了一些方法,如下所示:

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

并且授权属性可以正确检测到用户不属于该角色,并将其发送回 Azure 进行身份验证。

但是我看到的是用户已经通过 Azure AD 进行身份验证并登录到应用程序。他们没有机会在 Azure 屏幕上选择新的用户帐户进行登录。因此,当将他们弹回到 Azure AD 时,Azure AD 会说“您已经登录”并将他们直接发送回应用程序。 SecurityTokenValidated 事件一遍又一遍地重复触发。

但是用户仍然不具备该方法所需的角色,因此他们会被退回到 Azure 进行身份验证,显然我们陷入了循环。

除了编写自己的 Authorize 属性实现之外,还有其他方法可以解决此问题吗?

最佳答案

不幸的是,您偶然发现了 [Authorize] 的一个已知问题。有关说明和可能的解决方案,请参阅 https://github.com/aspnet/Mvc/issues/634 - 此时编写自定义属性可能是最简化的解决方法。

关于azure - 将 MVC 授权属性与使用 Azure Active Directory + OWIN 的角色结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25595548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com