我是否必须在ApplyResponseChallengeAsync中检查响应状态?
我已经编写了一个相当基本的AuthenticationHandler<T>
派生类来为我的REST服务执行自定义验证。
我曾假设(是的,我知道,坏主意) ApplyResponseChallengeAsync
只会在我需要应用我的挑战时被调用 - 例如它被描述为:
如果所考虑的认证方案将认证交互作为其请求流的一部分进行处理,则将此方法重写为dela(原文如此)与401挑战问题。 (如添加响应标题或将401结果更改为登录页面或外部登录位置的302)。
这听起来只有401发行时才会被调用。 但是,在一些有限的测试中,我们看到一些例外情况如下:
System.Web.HttpException (0x80004005): Server cannot append header after HTTP headers have been sent.
at System.Web.HttpHeaderCollection.SetHeader(String name, String value, Boolean replace)
at Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.Set(String key, String[] values)
at Microsoft.Owin.Infrastructure.OwinHelpers.AppendHeader(IDictionary`2 headers, String key, String values)
at OurAuthHandler.ApplyResponseChallengeAsync()
at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<ApplyResponseCoreAsync>d__8.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<TeardownAsync>d__5.MoveNext()
--- And so on
所以,想要调查这一点,我稍微更改了我们方法中的代码,以便我可以使用调试器来检查发生此异常的情况:
protected override Task ApplyResponseChallengeAsync()
{
try
{
foreach (var uri in Options.IdentityConfiguration.AudienceRestriction.AllowedAudienceUris)
{
Response.Headers.Append("WWW-Authenticate", "Bearer realm="" + uri + """);
}
return base.ApplyResponseChallengeAsync();
}
catch
{
throw; //Set a breakpoint here
}
}
而且,你看,当我的断点被击中时,我看到Response
的状态码是200 / OK。
问题(S)
所以,问题是,我的意思是我必须自己检查状态代码,是否有一些标志我必须传递/设置在某个地方,以便这种方法仅用于401s,或者我错过了其他的东西?
是的,你必须自己检查状态码。 该文档具有误导性。
请注意Katana项目中每个现有的AuthenticationHandler
如何检查状态码:
public class OpenIdConnectAuthenticationHandler : AuthenticationHandler<OpenIdConnectAuthenticationOptions>
{
...
protected override async Task ApplyResponseChallengeAsync()
{
if (Response.StatusCode == 401)
{
....
}
}
...
}
internal class TwitterAuthenticationHandler : AuthenticationHandler<TwitterAuthenticationOptions>
{
...
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times", Justification = "MemoryStream.Dispose is idempotent")]
protected override async Task ApplyResponseChallengeAsync()
{
if (Response.StatusCode != 401)
{
return;
}
}
...
}
public class WsFederationAuthenticationHandler : AuthenticationHandler<WsFederationAuthenticationOptions>
{
...
protected override async Task ApplyResponseChallengeAsync()
{
if (Response.StatusCode == 401)
{
...
}
}
...
}
我还检查了Katana项目的源代码:没有办法通过标志或其他东西来改变这种行为。
链接地址: http://www.djcxy.com/p/78401.html上一篇: Do I have to check the response status in ApplyResponseChallengeAsync?