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

标签 azure asp.net-mvc-5 authorization owin azure-active-directory

我正在构建一个 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/

相关文章:

azure - 如何在现有 AKS 群集上启用 Calico 网络策略

azure - Azure 服务总线和服务总线 1.1 之间有什么区别?

c# - LINQ to Entities 无法识别 MVC5 中的方法 'System.DateTime ParseExact(System.String, System.String, System.IFormatProvider)' 方法错误

php - 60 天后延长 Facebook 访问 token

html - html 中的 http 授权 header

security - 如何根据URL中的单页ID限制权限?

Azure 数据工厂管道启动 SSIS 集成运行时授权错误

azure - 在 Databricks 作业 API 中传递 JVM 参数

c# - ASP.NET MVC ActionFilter 不会阻止其他过滤器运行

asp.net-mvc - 关于 MVC 未处理的异常,从 Global.asax 重定向到共享错误 View