静默的ADFS身份验证失败,交互成功

时间:2019-07-26 09:48:32

标签: c# adfs adal adfs4.0

我正在使用ADAL.NET 3.19连接到运行ADFS 2016的服务器。当前,由于使用以下方法签名,系统使用登录提示:

var authResult = await authContext.AcquireTokenAsync(resourceId, clientId, redirectUri, new PlatformParameters(PromptBehavior.Always));

resourceIdclientIdredirectUri是从某些配置文件中提取的。然后,当我更改为使用下面的非交互式版本时,出现错误:

var uc = new UserPasswordCredential(username, password);
var authResult = await authContext.AcquireTokenAsync(resourceId, clientId, uc);

usernamepassword与我在第一个代码示例的交互式部分中提供的凭据匹配,但是第二个代码示例产生以下错误:

MSIS9605: The client is not allowed to access the requested resource.

内部有例外:

Response status code does not indicate success: 400 (BadRequest)

在服务器上,我在ADFS中看到以下错误(我用方括号中的变量替换了变量):

Encountered error during OAuth token request. 

Additional Data 

Exception details: 
Microsoft.IdentityServer.Web.Protocols.OAuth.Exceptions.OAuthUnauthorizedClientException: MSIS9321: Received invalid OAuth request. The client '[clientId]' is forbidden to access the resource '[ressourceId]'.
   at 
Microsoft.IdentityServer.Web.Protocols.OAuth.OAuthProtocolHandler.ValidateScopesInAccessToken(JsonWebSecurityToken token, String clientId, String relyingPartyId)
   at
Microsoft.IdentityServer.Web.Protocols.OAuth.OAuthProtocolHandler.BuildTokenResponseWithSerializedToken(OAuthProtocolContext context, WrappedHttpListenerContext httpContext, Uri originalRequestBaseUri, SecurityTokenElement signOnTokenElement, ArtifactSecurityTokenType originalTokenType, String clientId, String clientRedirectUri, String resource, Boolean isKmsiRequested, String authMethod)
   at
Microsoft.IdentityServer.Web.Protocols.OAuth.OAuthToken.OAuthTokenProtocolHandler.CreatePasswordResponse(OAuthUsernamePasswordContext passwordContext)

如何解决服务器将其视为无效请求的问题?

1 个答案:

答案 0 :(得分:0)

事实证明,ADFS服务器上依赖方信任的URI被配置为在URI的末尾不包含“ /”,但是在配置中却包括了它。我不知道为什么它会在两种方法重载之间产生差异,但是却始终导致结果偏离。因此,这才是真正的答案:仔细检查您的配置,并确保不区分大小写或路径分隔符。