IE 和 ASP.NET 的 IPv6 范围 ID 问题
设置:
域中的两台 W2K3 计算机均安装了 IPv6。应用程序位于 1 号机器上。
适用于 IE8 的功能:
机器 #2 可以使用 IPv4 地址登录应用程序 (http://192.168.../app)
机器 #2 可以使用机器名称登录应用程序 (http://machine1name/app) 计算机 #1 可以使用 IPv4 地址、计算机名称和本地主机登录应用程序。 机器 #1 可以使用本地 IPv6 地址(没有范围 ID)登录应用程序。
机器 #1 可以使用网络 IPv6 地址(没有范围 ID)登录应用程序。
什么不适用于 IE8,但适用于 Firefox:
机器 #2 无法使用机器 #1 的网络 IPv6 地址(带有范围 ID)登录应用程序。
原始问题:我已尝试缩小问题范围。我可以打开登录页面并输入我的凭据。在代码中,我检查 Active Directory 进行身份验证,并且用户确实获得了身份验证。但是,HttpContext.Current.User.Identity
从未设置。它应该在我调用 RedirectFromLoginPage(username)
时设置,并且是在 Machine #2 使用 IPv4 访问应用程序时设置。但是,当我使用 IPv6 地址时,HttpContext.Current.User.Identity
始终为空。
使用 IPv4 时身份验证和应用程序工作正常,所以我不认为这是代码问题,但不确定?或者我需要调整一些网络/IE 设置吗?
编辑:使用 IPv6 的 Firefox 和使用 IPv4 的 IE8 在创建身份验证 cookie 时没有问题。由于某种原因,带有 IPv6 的 IE8 无法创建 cookie,因此,RedirectFromLoginPage 出现了问题,它应该创建 cookie。
编辑2:问题似乎是使用IE时IPv6地址中的%
[即。范围 ID]。例如,使用 Firefox,您可以在地址中包含 %
,没有任何问题。使用 IE,如果您使用 IPv6(无论是本地 IP 还是网络 IP)本地访问应用程序,则可以省略作用域 ID。但是,当访问网络计算机上的应用程序时,您需要范围 ID。自从 您必须使用 %25
对 %
进行编码,这就是问题所在。
[附注。我知道这个问题有类似的标题,但不一样问题。]
Setup:
Two W2K3 machines in domain with IPv6 installed on both. App is on Machine #1.
What works with IE8:
Machine #2 can log into the app using IPv4 address (http://192.168.../app)
Machine #2 can log into the app using machine name (http://machine1name/app)
Machine #1 can log into the app using IPv4 address, machine name, and localhost.
Machine #1 can log into the app using local IPv6 address (without scope-id).
Machine #1 can log into the app using network IPv6 address (without scope-id).
What doesn't work with IE8, BUT works with Firefox:
Machine #2 can't log into the app using network IPv6 address of Machine #1 (with scope-id).
ORIGINAL ISSUE: I've tried to narrow down the problem. I can bring up the login page and enter my credentials. In code, I check Active Directory for authentication, and the user does get authenticated. However, the HttpContext.Current.User.Identity
is never set. It should be set when I call RedirectFromLoginPage(username)
, and it is when Machine #2 uses IPv4 to access the app. However, when I use the IPv6 address, HttpContext.Current.User.Identity
is always blank.
The authentication and application work fine when using IPv4, so I don't think it's a code issue, but not sure? Or is there some network/IE setting I need to adjust?
EDIT: Firefox with IPv6 and IE8 with IPv4 have no problem creating an authentication cookie. For some reason, IE8 with IPv6 cannot create the cookie, hence, the problem with RedirectFromLoginPage, which is supposed to create the cookie.
EDIT 2: The problem seems to be the %
in the IPv6 address when using IE [ie. the scope-id]. For example, with Firefox, you can have the %
in the address with no problem. With IE, if you are accessing an app locally using IPv6 (whether local or network IP), you can leave out the scope-id. However, when accessing an app on a network machine, you need the scope-id. And since
you have to encode the %
with %25
, that's where the problem is.
[ps. I know this question has a similar title, but it's not the same problem.]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
老实说,解决此问题的最佳方法是不要使用链接本地地址作为 Web 端点。正如您所发现的,IPv6 的这个区域定义不明确。
我建议改用静态 IPv6 地址。或者让您的网络管理员(您?)在您的子网上启用 IPv6 路由器通告,以便您可以获得“真实”(非链接本地)IPv6 地址。
请注意,您仍然可以使用“私有”IPv6 空间(就像使用 192.168.0.0/16 IPv4 地址一样)。
如果您没有“真正的”IPv6 子网,则可以使用编号为 < 的 /64 子网。 a href="https://secure.wikimedia.org/wikipedia/en/wiki/6to4" rel="nofollow">6to4 (如果您有一个真实的 IPv4 地址并且[最终],这可能会很好希望您的主机参与“真正的”IPv6 互联网)或获得独特的本地要使用的子网。
或者直接从 Hurricane Electric 等地方代理一条 6in4 隧道。
Quite honestly, the best way to solve this is to not use link-local addresses as web endpoints. As you have discovered, this area of IPv6 is ill-defined.
I would recommend using static IPv6 addresses instead. Either that, or have your network administrator (you?) enable IPv6 router advertisements on your subnet so you can get "real" (not link-local) IPv6 addresses.
Note, you can still use "private" IPv6 space (like you're doing with 192.168.0.0/16 IPv4 addresses)
If you don't have a "real" IPv6 subnet, you could either use a /64 subnet numbered for 6to4 (which might be good if you have a real IPv4 address and you [eventually] want your hosts to participate on the "real" IPv6 internet) or get a unique local subnet to use.
Or just go for it and broker a 6in4 tunnel from a place like Hurricane Electric.