C# “;此请求的授权已被拒绝”;对于使用Azure Active Directory的少数用户
我有一个本机iOS应用程序,具有Azure ADFS的单点登录身份验证。启动应用程序时,用户必须登录Azure Active Directory,并且在成功身份验证后,将返回一个令牌,以使用Web API验证所有服务端点调用。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成功返回数据,对于少
该授权对少数用户(例如开发人员登录)非常有效但是对于组织内的一些广告登录,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应用程序和