为什么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. ] - 管理员已经同意,为什么我得到这个?
  • 我去公司 AD并更改应用程序权限以包含读写目录数据
  • 我前往Customer AD检查应用程序门户 ,仪表板已经显示列出的新许可。 没有人需要同意! 管理员即使在下次登录时也没有看到任何变化。 这怎么不是一个安全漏洞?
  • 我对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?