对于使用Azure Active Directory的少数用户

时间:2015-06-16 04:37:59

标签: c# azure owin adfs

我有一个本机iOS应用程序,使用Azure ADFS进行单点登录身份验证。在启动应用程序时,用户必须登录Azure Active Directory并成功进行身份验证才能返回令牌以使用Web API验证所有服务端点呼叫。
授权对少数用户非常有效(例如开发人员登录) )但是对于组织内的一些AD登录,Web API会返回Authorization has been denied for this request。 我已经从这个等式中删除了应用程序,以保持简单,并尝试使用Postman来检查Web API中传递授权令牌的Web API。
对于少数帐户,Web API成功地返回数据帐户Authorization has been denied for this request被抛出。 ( 401 Unauthorized
鉴于身份验证引擎在少数帐户中成功运行,我想知道这是否是Active Directory用户角色/组策略的问题。
有没有人有这个问题或知道这个问题的原因?对此的任何帮助都将受到高度赞赏。

更多详情:

  • 在Azure中托管的WebAPI 2.0。
  • 在Web API StartUp类

        var azureActiveDirectoryBearerAuthenticationOptions = new WindowsAzureActiveDirectoryBearerAuthenticationOptions
        {
            AuthenticationType = "OAuth2Bearer",
    
            Tenant = "companyName.onmicrosoft.com",
            TokenValidationParameters = new TokenValidationParameters
            {
                ValidAudience = ConfigurationManager.AppSettings["ida:AppIdUri"],
            },
            Provider = new OAuthBearerAuthenticationProvider()
            {
                OnRequestToken = (context) =>
                {
                    OAuthRequestTokenContext token = context;
                    System.Diagnostics.Debug.WriteLine(token.Token);
                    return Task.FromResult(0);   
                },  
                OnApplyChallenge = (context) =>
                {
                    OAuthChallengeContext challenge = context;
                    var types = challenge.OwinContext.Authentication.GetAuthenticationTypes();
                    foreach (var type in types)
                    {
                        System.Diagnostics.Debug.WriteLine(type.Caption + " "+ type.AuthenticationType);
                    }
                    return Task.FromResult(0);
                },
                OnValidateIdentity = (context) =>
                {
                    var authenticationTicket = context.Ticket;
                    var claims = ClaimsHelper.GetClaimsFor(authenticationTicket.Identity.Name);
                    context.Ticket.Identity.AddClaims(claims);
    
                    return Task.FromResult(0);
                }
            }
    
        };
    

    `

OAuthBearerAuthenticationProvider中的OWIN验证类型是 OAuth2Bearer和Federation
    此时不涉及基于角色的声明。

客户端生成这样的令牌,并在每个请求上将其作为标头

中的承载令牌传递
AuthenticationContext authenticationContext = new AuthenticationContext(azureSettings.AdAuthority);
AuthenticationResult authenticationResult = 
await authenticationContext.AcquireTokenAsync(azureSettings.AdResource,
                          azureSettings.AdClientId,
                          new Uri(azureSettings.AdRedirect),
                          new AuthorizationParameters(view),
                          UserIdentifier.AnyUser,
                          string.Format("domain_hint={0}", azureSettings.AdDomainHint));

`

Azure Active Directory与本地Active Directory同步。

尝试了以下但是徒劳无功:

创建一个具有相同角色和部门的新AD用户,该用户可以成功检索数据并将同步发送到AAD,甚至新用户也可以获得未授权。确保Azure上的Web API不限于单个分配用户。

1 个答案:

答案 0 :(得分:0)

最后到了这个问题的底部。 ADAL设置或ADFS的OAuth2.0身份验证没有任何问题。呼叫确实进行到OnValidateIdentity = (context) =>,这意味着设置一切都很好。

问题在于具有检查属于特定声明的用户的逻辑的代码。  var claims = ClaimsHelper.GetClaimsFor(authenticationTicket.Identity.Name);

ClaimsHelper.GetClaimsFor方法深入,

 if (containsRole == false)
                        {
                            throw new AppDefinedException("You are not configured with any roles for access to the product, for identity: " + userId);
                        }

由于授权在那里失败并且抛出异常,因此该异常冒泡到OWIN中间件,并且抛出了默认(通用) 401 Unauthorized 异常。但是OWIN中间件从未出现异常细节(甚至不是内部异常)。

我对AD用户角色设置有问题的一般例外感到困惑,并且它首先甚至都没有进行身份验证。

注意

如果我们自己的代码故意拒绝授权,那么记录(数据库或文件系统)将是一个好主意。

我仍在调查拒绝请求将最有意义的信息传递给App的最佳方法。如果您知道处理此问题的最佳方法,请通知我。

另外,请注意:即使在配置文件中启用了日志侦听器,如果引发任何异常,Katana也只会记录到.Net跟踪。

提示:查看jwt是否未损坏的最佳方法 - jwt.io

感谢那些试图提供帮助的人。