C# “;此请求的授权已被拒绝”;对于使用Azure Active Directory的少数用户

C# “;此请求的授权已被拒绝”;对于使用Azure Active Directory的少数用户,c#,azure,owin,adfs,C#,Azure,Owin,Adfs,我有一个本机iOS应用程序,具有Azure ADFS的单点登录身份验证。启动应用程序时,用户必须登录Azure Active Directory,并且在成功身份验证后,将返回一个令牌,以使用Web API验证所有服务端点调用。该授权对少数用户(例如开发人员登录)非常有效但是对于组织内的一些广告登录,Web API返回此请求的授权已被拒绝。 我已经从这个等式中删除了应用程序,以保持其简单性,并尝试与邮递员一起点击在标题中传递授权令牌的Web API。对于少数帐户,Web API成功返回数据,对于少

我有一个本机iOS应用程序,具有Azure ADFS的单点登录身份验证。启动应用程序时,用户必须登录Azure Active Directory,并且在成功身份验证后,将返回一个令牌,以使用Web API验证所有服务端点调用。
该授权对少数用户(例如开发人员登录)非常有效但是对于组织内的一些广告登录,Web API返回
此请求的授权已被拒绝
。
我已经从这个等式中删除了应用程序,以保持其简单性,并尝试与邮递员一起点击在标题中传递授权令牌的Web API。
对于少数帐户,Web API成功返回数据,对于少数帐户,此请求的
授权被拒绝。(401 Unauthorized)
考虑到身份验证引擎在少数帐户中成功运行,我想知道这是否是Active Directory用户角色/组策略的问题。
是否有人遇到过此问题或知道此问题的原因?在此方面的任何帮助都将不胜感激

更多详细信息:

  • WebAPI 2.0托管在Azure中
  • 在WebAPI启动类中

        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);
                }
            }
    
        };
    
    `

OAuthBeareAuthenticationProvider
中的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同步

尝试了以下操作,但徒劳无功:


创建一个新的广告用户,其角色和部门与能够成功检索数据并同步到AAD的用户完全相同,甚至新用户也未经授权。确保Azure上的Web API不限于单个分配的用户

终于弄清了这个问题的真相。ADAL设置或ADF的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未授权异常。但由于某种原因,OWIN中间件从未传递异常详细信息(甚至没有作为内部异常)

我对一个一般的例外感到困惑,即广告用户角色的设置有问题,甚至一开始就没有进行身份验证

注意

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

我仍在研究拒绝请求的最佳方法,以便将更有意义的信息传递回应用程序。如果你知道最好的处理方法,请告诉我

另外,还有一个附带说明:Katana仅在出现任何异常时才记录到.Net跟踪,即使在配置文件中启用了日志侦听器

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


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

终于找到了问题的症结所在。ADAL设置或ADF的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未授权异常。但由于某种原因,OWIN中间件从未传递异常详细信息(甚至没有作为内部异常)

我对一个一般的例外感到困惑,即广告用户角色的设置有问题,甚至一开始就没有进行身份验证

注意

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

我仍在研究拒绝请求的最佳方法,以便将更有意义的信息传递回应用程序。如果你知道最好的处理方法,请告诉我

另外,还有一个附带说明:Katana仅在出现任何异常时才记录到.Net跟踪,即使在配置文件中启用了日志侦听器

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


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

问题肯定不是Xamarin iOS应用程序的问题。使用WPF应用程序对其进行了测试,问题仍然存在。另外,创建了一个新用户,其权限与可以在Azure上访问web API但仍未经授权的用户相同。只能考虑在Web APP=>Configuration下使用特定用户来访问Web API。将使用更多信息更新此线程。您可以共享跟踪文件吗?此外,如果您可以使用以下信息启用日志记录:,这将添加来自OAuthBeareAuthenticationHandler的日志,并帮助查看它是否能够将令牌反序列化为有效的ticket.Cool。谢谢@ezile。我正在根据尝试
SuppressDefaultHostAuthentication()
。我将尝试捕获日志并更新此帖子。Xamarin iOS应用程序肯定不会出现问题。使用WPF应用程序和