返回   cpper编程论坛 > Blog > Innocentius
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

为这篇文章评分

在使用Passport认证的网站返回401错误代码

发表于 2006-11-23 06:46 PM 作者: Innocentius
最近做的一个ASP.NET项目使用了Passport认证,但是与常规使用Passport的网站不同,如果认证失败应当返回401而不是重定向到Passport网站或者返回什么提示重定向的HTML。
这件事情困扰了我好久,我就不明白为什么将 StatusCode 设置为 401,但是实际客户端得到的居然是 200。查阅了所有 Passport SDK 文档也没有结果,最后只能祭器最终法宝:.NET Reflector,看看到底是怎么回事。
在 System.Web.Security.PassportAuthenticationModule 中的代码显示出,它的 OnLeave 方法被连接到 WebApplication 的 EndRequest 事件上。在这个方法中有下面的代码:

代码:
 HttpContext context1 = application1.Context;
      if ((PassportAuthenticationModule._fAuthChecked && PassportAuthenticationModule._fAuthRequired) && (((context1.User != null) && (context1.User.Identity != null)) && (context1.User.Identity is PassportIdentity)))
      {
            PassportIdentity identity1 = (PassportIdentity) context1.User.Identity;
            if ((context1.Response.StatusCode == 0x191) && !identity1.WWWAuthHeaderSet)
            {
                  if (((PassportAuthenticationModule._LoginUrl == null) || (PassportAuthenticationModule._LoginUrl.Length < 1)) || (string.Compare(PassportAuthenticationModule._LoginUrl, "internal", StringComparison.Ordinal) == 0))
                  {
                        context1.Response.Clear();
                        context1.Response.StatusCode = 200;
                        if (!ErrorFormatter.RequiresAdaptiveErrorReporting(context1))
                        {
                              string text1 = context1.Request.Url.ToString();
                              int num1 = text1.IndexOf(‘?’);
                              if (num1 >= 0)
                              {
                                    text1 = text1.Substring(0, num1);
                              }
                              string text2 = identity1.LogoTag2(HttpUtility.UrlEncode(text1, context1.Request.ContentEncoding));
                              string text3 = SR.GetString("PassportAuthFailed", new object[] { text2 });
                              context1.Response.Write(text3);
                        }
                        else
                        {
                              ErrorFormatter formatter1 = new PassportAuthFailedErrorFormatter();
                              context1.Response.Write(formatter1.GetAdaptiveErrorMessage(context1, true));
                        }
                  }
果然它对 401 做了特殊的处理,替换成 200 了。现在原因找到以后要解决就容易很多。第一个 if 语句中有 5 个判断条件,并且全部是 &&。只要破坏其中一个即可。最终,在我设置 StatusCode 为 401 的同时将 HttpContext.User 设置为 null,这个问题即告解决!
评论 0 Email文章
评论总数 0

评论

发表评论 发表评论
作者为 Innocentius 的最新文章

所有时间均为格林尼治时间 +9。现在的时间是 08:13 PM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2009,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0