我刚刚使用Azure Active Directory单点登录编写了一个应用程序。
同意框架在AccountController
处理,位于下面列出的ApplyForConsent
行动中。直到最近,一切都无缝地发挥作用。我可以作为外部租户的管理员用户同意,然后退出应用程序,并以非管理员用户身份再次登录。
我的Azure Active Directory应用程序需要以下委派权限:
现在,在我通过同意框架(通过从表单POST作为管理员用户ApplyForConsent
)之后,以非管理员用户身份登录失败,并显示错误消息AADSTS90093(此操作只能由管理员执行)。无益的是,错误消息并未说明“此操作”实际上是什么,但我怀疑它是第三个(访问您组织的目录)。
我再次强调,这最近才停止工作。这部分代码没有任何变化,虽然我认为代码库中其他地方的其他变化可能会产生连锁反应,但我仍然无知。
查看文档,似乎这种同意框架的使用已被视为“遗留”,但我很难找到更新的实现。
以下代码示例中的请求权限是单个字符串"DirectoryReaders"
。
我有三个问题可以帮助我调试这段代码:
"DirectoryReaders"
?这是现有代码:
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;
}
答案 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
汇总