「エンドポイントのリクエストを承認する、サポートされていないresponse_typeパラメータが含まれている」:ときに問題があります(コピー)のVisual Studio SPAのテンプレートからApplicationOAuthProvider.cs
取ると、このコードがどこにあるか、それがあります:
public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
{
if (context.ClientId == _publicClientId)
{
var expectedRootUri = new Uri(context.Request.Uri, "/");
if (expectedRootUri.AbsoluteUri == context.RedirectUri)
{
context.Validated();
}
}
return Task.FromResult<object>(null);
}
は、これは明らかに任意のをブロックしますはhttp://localhost/
やhttp://domain.com/
のようには見えないので、例えばhttp://domain.com/home
は動作しません。
今、下記これは、すべての作業を行い刀でInvokeAuthorizeEndpointAsync
のための源であり、あなたはそれがこのMVC /ウェブAPIアプリケーション(この登録は、通常Startup.Auth.cs
で起こる)のために登録される可能性があります任意のカスタムOAuthProvider
に呼び出しを見ることができます。
private async Task<bool> InvokeAuthorizeEndpointAsync()
{
var authorizeRequest = new AuthorizeEndpointRequest(Request.Query);
var clientContext = new OAuthValidateClientRedirectUriContext(
Context,
Options,
authorizeRequest.ClientId,
authorizeRequest.RedirectUri);
if (!String.IsNullOrEmpty(authorizeRequest.RedirectUri))
{
bool acceptableUri = true;
Uri validatingUri;
if (!Uri.TryCreate(authorizeRequest.RedirectUri, UriKind.Absolute, out validatingUri))
{
// The redirection endpoint URI MUST be an absolute URI
// http://tools.ietf.org/html/rfc6749#section-3.1.2
acceptableUri = false;
}
else if (!String.IsNullOrEmpty(validatingUri.Fragment))
{
// The endpoint URI MUST NOT include a fragment component.
// http://tools.ietf.org/html/rfc6749#section-3.1.2
acceptableUri = false;
}
else if (!Options.AllowInsecureHttp &&
String.Equals(validatingUri.Scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase))
{
// The redirection endpoint SHOULD require the use of TLS
// http://tools.ietf.org/html/rfc6749#section-3.1.2.1
acceptableUri = false;
}
if (!acceptableUri)
{
clientContext.SetError(Constants.Errors.InvalidRequest);
return await SendErrorRedirectAsync(clientContext, clientContext);
}
}
await Options.Provider.ValidateClientRedirectUri(clientContext);
if (!clientContext.IsValidated)
{
_logger.WriteVerbose("Unable to validate client information");
return await SendErrorRedirectAsync(clientContext, clientContext);
}
var validatingContext = new OAuthValidateAuthorizeRequestContext(
Context,
Options,
authorizeRequest,
clientContext);
if (string.IsNullOrEmpty(authorizeRequest.ResponseType))
{
_logger.WriteVerbose("Authorize endpoint request missing required response_type parameter");
validatingContext.SetError(Constants.Errors.InvalidRequest);
}
else if (!authorizeRequest.IsAuthorizationCodeGrantType &&
!authorizeRequest.IsImplicitGrantType)
{
_logger.WriteVerbose("Authorize endpoint request contains unsupported response_type parameter");
validatingContext.SetError(Constants.Errors.UnsupportedResponseType);
}
else
{
await Options.Provider.ValidateAuthorizeRequest(validatingContext);
}
if (!validatingContext.IsValidated)
{
// an invalid request is not processed further
return await SendErrorRedirectAsync(clientContext, validatingContext);
}
_clientContext = clientContext;
_authorizeEndpointRequest = authorizeRequest;
var authorizeEndpointContext = new OAuthAuthorizeEndpointContext(Context, Options);
await Options.Provider.AuthorizeEndpoint(authorizeEndpointContext);
return authorizeEndpointContext.IsRequestCompleted;
}
これが鍵です:
await Options.Provider.ValidateClientRedirectUri(clientContext);
だからあなたのソリューションは、ValidateClientRedirectUri
が検証を実行する方法を変更することです - デフォルトのSPAの実装があり、あなたのように非常に素朴な、見ることができます。
SPAに問題があるのは、主に有用な情報がなく、ASP.NET IdentityとOWINの両方について、KnockoutJSの実装で何が起こっているかという点です。
もう少し複雑なことをしようとする人は誰でも問題に遭遇するので、Microsoftはこれらのテンプレートに対してより包括的なドキュメントを提供したいと考えています。
これは、私のリダイレクトURIをブロックする上記の実装だと思ってOWIN(Katana)のソースコードを掘り下げていますが、うまくいけば他の人にも役立ちます。
HTH
我々がする必要があります「AccountController」の「ExternalLogin」アクションのコードを参照してください。リダイレクトが発生する場所です。 – trailmax
@trailmax ASP.NET Projectダイアログでシングルページアプリケーションテンプレートを選択し、デモでreturn urlを変更した場合、実際に同じ問題が発生します。 '/'はjavascriptファイルの/ testingのようなものです。ありがとう! – doorman