我有一个本机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用户角色/组策略的问题。
有没有人有这个问题或知道这个问题的原因?对此的任何帮助都将受到高度赞赏。
更多详情:
在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不限于单个分配用户。
答案 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
感谢那些试图提供帮助的人。