Azure Active Directory:Consent Framework已停止同意

时间:2015-07-01 10:23:57

标签: azure-active-directory

我刚刚使用Azure Active Directory单点登录编写了一个应用程序。

同意框架在AccountController处理,位于下面列出的ApplyForConsent行动中。直到最近,一切都无缝地发挥作用。我可以作为外部租户的管理员用户同意,然后退出应用程序,并以非管理员用户身份再次登录。

我的Azure Active Directory应用程序需要以下委派权限:

  • 读取目录数据
  • 启用登录并阅读用户的个人资料
  • 访问您组织的目录

现在,在我通过同意框架(通过从表单POST作为管理员用户ApplyForConsent)之后,以非管理员用户身份登录失败,并显示错误消息AADSTS90093(此操作只能由管理员执行)。无益的是,错误消息并未说明“此操作”实际上是什么,但我怀疑它是第三个(访问您组织的目录)。

我再次强调,这最近才停止工作。这部分代码没有任何变化,虽然我认为代码库中其他地方的其他变化可能会产生连锁反应,但我仍然无知。

查看文档,似乎这种同意框架的使用已被视为“遗留”,但我很难找到更新的实现。

以下代码示例中的请求权限是单个字符串"DirectoryReaders"

我有三个问题可以帮助我调试这段代码:

  1. “读取目录数据”和“访问您组织的目录”之间有什么区别?我什么时候需要一个而不是另一个?
  2. 我是否需要申请的不仅仅是"DirectoryReaders"
  3. 现在有更好的方法来实施同意框架吗?
  4. 这是现有代码:

    private static readonly string ClientId = ConfigurationManager.AppSettings["ida:ClientID"];
    
    [HttpPost]
    public ActionResult ApplyForConsent()
    {
        string signupToken = Guid.NewGuid().ToString();
        string replyUrl = Url.Action("ConsentCallback", "Account", new { signupToken }, Request.Url.Scheme);
        DatabaseIssuerNameRegistry.CleanUpExpiredSignupTokens();
        DatabaseIssuerNameRegistry.AddSignupToken(signupToken, DateTimeOffset.UtcNow.AddMinutes(5));
        return new RedirectResult(CreateConsentUrl(ClientId, "DirectoryReaders", replyUrl));
    }
    
    [HttpGet]
    public ActionResult ConsentCallback()
    {
        string tenantId = Request.QueryString["TenantId"];
        string signupToken = Request.QueryString["signupToken"];
        if (DatabaseIssuerNameRegistry.ContainsTenant(tenantId))
        {
            return RedirectToAction("Validate");
        }
    
        string consent = Request.QueryString["Consent"];
        if (!String.IsNullOrEmpty(tenantId) && String.Equals(consent, "Granted", StringComparison.OrdinalIgnoreCase))
        {
            if (DatabaseIssuerNameRegistry.TryAddTenant(tenantId, signupToken))
            {
                return RedirectToAction("Validate");
            }
        }
    
        const string error = "Consent could not be provided to your Active Directory.  Please contact SharpCloud for assistance.";
        var reply = Request.Url.GetLeftPart(UriPartial.Authority) + Url.Action("Consent", new { error });
        var config = FederatedAuthentication.FederationConfiguration.WsFederationConfiguration;
        var signoutMessage = new SignOutRequestMessage(new Uri(config.Issuer), reply);
        signoutMessage.SetParameter("wtrealm", config.Realm);
        FederatedAuthentication.SessionAuthenticationModule.SignOut();
        return Redirect(signoutMessage.WriteQueryString());
    }
    
    private static string CreateConsentUrl(string clientId, string requestedPermissions, string consentReturnUrl)
    {
        string consentUrl = String.Format(CultureInfo.InvariantCulture, ConsentUrlFormat, HttpUtility.UrlEncode(clientId));
    
        if (!String.IsNullOrEmpty(requestedPermissions))
        {
            consentUrl += "&RequestedPermissions=" + HttpUtility.UrlEncode(requestedPermissions);
        }
        if (!String.IsNullOrEmpty(consentReturnUrl))
        {
            consentUrl += "&ConsentReturnURL=" + HttpUtility.UrlEncode(consentReturnUrl);
        }
    
        return consentUrl;
    }
    

2 个答案:

答案 0 :(得分:1)

我认为此链接可解决您的问题:

http://blogs.msdn.com/b/aadgraphteam/archive/2015/03/19/update-to-graph-api-consent-permissions.aspx

快速摘要显示,现在只有管理员才能同意网络应用“访问您组织的目录”。

这一变化是在3月份进行的。原生应用程序不受更改的影响。

答案 1 :(得分:0)

我怀疑是对的。我在问题中使用了传统技术。通过迁移到Owin和Identity 2.0,所有问题都得到了解决。

新方法由https://github.com/AzureADSamples/WebApp-GroupClaims-DotNet

汇总