我正在使用ADAL.NET 3.19连接到运行ADFS 2016的服务器。当前,由于使用以下方法签名,系统使用登录提示:
var authResult = await authContext.AcquireTokenAsync(resourceId, clientId, redirectUri, new PlatformParameters(PromptBehavior.Always));
resourceId
,clientId
和redirectUri
是从某些配置文件中提取的。然后,当我更改为使用下面的非交互式版本时,出现错误:
var uc = new UserPasswordCredential(username, password);
var authResult = await authContext.AcquireTokenAsync(resourceId, clientId, uc);
username
和password
与我在第一个代码示例的交互式部分中提供的凭据匹配,但是第二个代码示例产生以下错误:
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)
如何解决服务器将其视为无效请求的问题?
答案 0 :(得分:0)
事实证明,ADFS服务器上依赖方信任的URI被配置为在URI的末尾不包含“ /”,但是在配置中却包括了它。我不知道为什么它会在两种方法重载之间产生差异,但是却始终导致结果偏离。因此,这才是真正的答案:仔细检查您的配置,并确保不区分大小写或路径分隔符。