gpt4 book ai didi

asp.net - 在 .NET 4.5 中混合 Windows 和表单例份验证 : how to keep Request. IsAuthenticated = false 直到创建表单例份验证票证之后?

转载 作者:行者123 更新时间:2023-12-02 20:27:56 24 4
gpt4 key购买 nike

更新:

我仅通过一些相当简单的更改就解决了这个问题,请参阅下面我的 self 回答。

原始问题:

我有一个同时使用 Windows 身份验证和表单例份验证的 ASP.NET Web 应用程序。 Forms 身份验证被定义为 Web.config 中的身份验证模式(请参阅下面的摘录)。在 IIS 7 中,在 Web 应用程序(又名虚拟目录)级别,禁用匿名身份验证,并启用 Windows 身份验证。

在 .NET 1.1 到 .NET 4.0 和 IIS6/7/7.5 中,在通过 Windows 身份验证成功进行身份验证之后,但在通过表单例份验证进行身份验证之前(创建表单例份验证票证/cookie),Global.Application_AuthenticateRequest() 发现 Request.IsAuthenticatedfalse。一旦 Request.IsAuthenticated 变为 trueSystem.Web.HttpContext.Current.User 的类型就是 System.Security.Principal。 GenericPrincipal (并且 User.IdentitySystem.Web.Security.FormsIdentity)

在 IIS7 服务器上安装 .NET 4.5 后,此行为发生了变化。未对 Web.config 文件进行任何更改,也未对 IIS 进行手动更改。我所做的唯一更改是安装 .NET 4.5。卸载 4.5 并重新安装 4.0 后,该行为恢复为“正常”。

我注意到的不同行为是,在通过 Windows 成功进行身份验证之后,但在通过表单进行身份验证之前(尚未创建表单例份验证票证),Application_AuthenticateRequest 现在显示 Request.IsAuthenticated true。此外,System.Web.HttpContext.Current.User.Identity 现在是 System.Security.Principal.WindowsIdentity(而不是 FormsIdentity)。

  1. 有人可以解释一下为什么会有所不同吗?
  2. 是否有一个配置选项(例如 web.config 更改或 IIS 设置)可以用来强制它以 4.0 方式工作? (这样 Windows 身份验证在设置 Request.IsAuthenticated = true 方面不会胜过表单例份验证?)

我已经搜索 Msft 文档几个小时了..他们所有关于混合 Windows 和 Forms auth 的信息似乎已经过时了好几年(2004 年左右),并且关于 .NET 4.5 更改的详细信息在这个特定的情况下相当稀疏面积。

摘自 web.config:(是的,default.aspx 是故意的,在本例中我不使用 login.aspx,但它已经工作了 5 年多,并且在所有以前的 .net 版本中都运行良好)。

<authentication mode="Forms">
<forms name=".ASPXAUTH" protection="All" timeout="200" loginUrl="default.aspx" defaultUrl="~/default.aspx" />
</authentication>

摘自 Global.asax.cs:

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (Request.IsAuthenticated)
{
// stuff for authenticated users
// prior to upgrading to .NET 4.5, this block was not hit until
// after the forms authentication ticket was created successfully
// (after validating user and password against app-specific database)
}
else
{
// stuff for unauthenticated users
// prior to upgrading to .NET 4.5, this block was hit
// AFTER windows auth passed but BEFORE forms auth passed
}
}

最佳答案

回复:有人可以解释一下为什么这是不同的吗?

我注意到 4.5 中 System.Web.Hosting.IIS7WorkerRequest.SynchronizeVariables() 发生了变化。区别如下(源码来自reflector):

在 4.0 中,SynchronizeVariables() 仅在启用 Windows 身份验证的情况下同步 IPrincipal/IHttpUser。

internal void SynchronizeVariables(HttpContext context)
{
...
if (context.IsChangeInUserPrincipal && WindowsAuthenticationModule.IsEnabled)
// the second condition checks if authentication.Mode == AuthenticationMode.Windows
{
context.SetPrincipalNoDemand(this.GetUserPrincipal(), false);
}
...
}

在 4.5 中,如果启用了任何身份验证 (AuthenticationConfig.Mode != AuthenticationMode.None),SynchronizeVariables() 会同步 IPrincipal/IHttpUser

[PermissionSet(SecurityAction.Assert, Unrestricted=true)]
internal void SynchronizeVariables(HttpContext context)
{
...
if (context.IsChangeInUserPrincipal && IsAuthenticationEnabled)
{
context.SetPrincipalNoDemand(this.GetUserPrincipal(), false);
}
...
}

private static bool IsAuthenticationEnabled
{
get
{
if (!s_AuthenticationChecked)
{
bool flag = AuthenticationConfig.Mode != AuthenticationMode.None;
s_AuthenticationEnabled = flag;
s_AuthenticationChecked = true;
}
return s_AuthenticationEnabled;
}
}

我怀疑上述更改是身份验证中行为更改的根本原因。

更改之前:ASP.NET 不会与 IIS 同步来获取用户的 Windows 身份(尽管 IIS 确实进行了 Windows 身份验证)。由于没有进行身份验证,ASP.NET 仍然可以进行表单例份验证。

更改后:ASP.NET 与 IIS 同步以获取用户的 Windows 身份。因为设置了 context.Current.User,所以 ASP.NET 不会进行表单例份验证。

关于asp.net - 在 .NET 4.5 中混合 Windows 和表单例份验证 : how to keep Request. IsAuthenticated = false 直到创建表单例份验证票证之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20863108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com