为什么Azure AD无法登录非
环境:
两个Azure AD: 公司 , 客户
公司发布了一个名为Portal的ASP.NET5网络应用程序,该应用程序设置为多租户。
客户有2个用户:用户(只是用户)和管理员(目录中是全局管理员)。
门户网站最初设置为要求1个应用程序权限:读取目录数据
-
这里是我经历的流程 ,我相信Azure AD在多个步骤中行为不当。 请指出我是否缺少一些东西。
AADSTS90093: This operation can only be performed by an administrator. Sign out and sign in as an administrator or contact one of your organization's administrators.
AADSTS90093: This operation can only be performed by an administrator. Sign out and sign in as an administrator or contact one of your organization's administrators.
] - 管理员已经同意,为什么我得到这个? 我对https://msdn.microsoft.com/en-us/library/azure/dn132599.aspx的理解是应用程序权限不被弃用。
UPDATE
我在WebApp中的配置:
app.UseOpenIdConnectAuthentication(options =>
{
options.ClientId = Configuration.Get("ActiveDirectory:ClientId");
options.Authority = String.Format(Configuration.Get("ActiveDirectory:AadInstance"), "common/"); //"AadInstance": "https://login.windows.net/{0}"
options.PostLogoutRedirectUri = Configuration.Get("ActiveDirectory:PostLogoutRedirectUri"); //"PostLogoutRedirectUri": "https://localhost:44300/"
options.TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
{
// The following commented-out line should work according to
// http://stackoverflow.com/questions/29317910/why-does-the-role-claim-have-incorrect-type
// But, it does not work in ASP.NET5 (currently), so see the "Hack." down below
// RoleClaimType = "roles",
ValidIssuers = new[] { "https://sts.windows.net/a1028d9b-bd77-4544-8127-d3d42b9baebb/", "https://sts.windows.net/47b68455-a2e6-4114-90d6-df89d8468abc/" }
};
options.Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = (context) =>
{
// This ensures that the address used for sign in and sign out is picked up dynamically from the request,
// which is neccessary if we want to deploy the app to different URLs (eg. localhost/immerciti-dev, immerciti.azurewebsites.net/www.immerciti.com)
string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase;
context.ProtocolMessage.RedirectUri = appBaseUrl;
context.ProtocolMessage.PostLogoutRedirectUri = appBaseUrl;
return Task.FromResult(0);
},
AuthorizationCodeReceived = async context =>
{
// Get Access Token for User's Directory
try
{
var identity = (ClaimsIdentity)context.AuthenticationTicket.Principal.Identity;
// Hack. TODO: keep an eye on developments around here
foreach (var claim in identity.FindAll("roles"))
{
// Readd each role with the proper claim type
identity.AddClaim(new Claim(identity.RoleClaimType, claim.Value, claim.ValueType, claim.Issuer, claim.OriginalIssuer));
}
}
catch (AdalException)
{
context.HandleResponse();
context.Response.Redirect("/Error/ShowError?errorMessage=Were having trouble signing you in&signIn=true");
}
}
};
};
感谢您提供的信息。 我会先回答#7,因为它看起来很惊人。 它乍看起来像一个安全漏洞,但事实并非如此。 这是我们正在努力解决的Azure管理门户中的一个错误。 在“客户”租户视图中,UX显示应用程序(在公司租户中定义)请求的权限。 它应该显示“客户”租户实际授予的权限。 在这种情况下,如果您的应用程序实际尝试了写入Graph API的调用,它将获得拒绝访问错误。 反正 - 不是安全漏洞 - 但可以肯定地理解为什么它看起来像这样 - 对此感到抱歉。 我们会尽力尽快解决这个问题。
关于您的一些关于同意行为的其他问题......顺便说一句,我们正在寻求改进文档。 无论如何,我会尽量从设计行为的角度回答这个问题,因为它看起来像是多次改变了你的app配置。
如果您选择任何应用程序权限(未授予权限),则同意UX默认为“代表组织的同意”体验。 在这种模式下,同意页面总是显示,管理员是否同意以前。 如果使用prompt = admin_consent的QS参数向授权端点发出请求,也可以强制执行此行为。 假设您沿着这条道路走下去了,您拥有的唯一权限是仅限应用程序“读取目录”和管理员同意书。 现在,用户来到用户没有任何允许他们登录并获得应用程序的id_token的授权(只读应用程序目前不适用),因此同意对话框尝试代表管理员显示的组织同意,但这是一个非管理员,所以你得到的错误。 现在,如果您为该应用添加已委派的“签到我并阅读我的个人资料”权限,并让您的管理员重新署名,您会看到现在用户不会被要求获得同意。 我要做的是回到我们的团队,看看是否有任何目录权限(仅限应用程序或委托)应允许任何用户获取登录令牌。 有人可能会认为这应该是这样。
HTHS,
链接地址: http://www.djcxy.com/p/25743.html上一篇: Why Azure AD fails to login non
下一篇: how to check if a string contains substring and color it in javascript?