0

我正在尝试实现 ActiveDirectoryMembership 提供程序,以便可以对活动目录使用表单身份验证。

我可以浏览到应用程序,并被重定向到登录页面。如果我输入错误的密码,我会得到正确的错误。如果我输入正确的密码,它会将我重定向到默认 URL (/Secure/Default.aspx),但会立即重定向回登录页面。我可以看到两个重定向,因为我使用的是提琴手。所以我确定它正在正确地针对 AD 进行身份验证,但仍将我带回登录页面。我也知道浏览器确实接受 cookie,因为我在应用程序中构建了一个测试页面来证明这一点。我已经在下面包含了 web.config 和相关代码,只是无法弄清楚我错过了什么......

编辑: 我发现如果我指定 UseUri 而不是 UseCookies,一切都会开始工作。但是我已经验证了我可以将数据存储在一个页面上的 cookie 中,并在另一个页面上检索它,那么为什么它不适用于身份验证部分呢?

编辑 2 我还从登录页面中删除了我的代码并使用了标准登录控件,同样的问题。

Web.config 文件:

<connectionStrings>
    <add name="ADConnectionString" connectionString="LDAP://YNET" />
</connectionStrings>
<system.web>      
    <authentication mode="Forms">
      <forms name=".ASPXAUTH" 
             path="/FormsAuth"
             loginUrl="~/SignIn.aspx" 
             defaultUrl="~/Secure/Default.aspx" 
             timeout="20" 
             requireSSL="false"
             protection="All"
             slidingExpiration="true"
             cookieless="UseCookies"
             enableCrossAppRedirects="false"/>
    </authentication>

    <authorization>
      <!-- Deny unauthenticated users will cause automatic redirect to the sign in page when using forms authentication. -->
      <deny users="?"/>
      <allow users="*"/>
    </authorization>

    <!-- For non AD passthrough authentication, specify the defaultProvider property -->
    <membership defaultProvider="ActiveDirectoryMembershipProvider">
      <providers>
        <clear/>
        <add name="ActiveDirectoryMembershipProvider"
             type="System.Web.Security.ActiveDirectoryMembershipProvider"
             connectionStringName="ADConnectionString"
             attributeMapUsername="sAMAccountName"/>

       </providers>      
    </membership>
</system.web>

登录页面:

bool bIsValid = System.Web.Security.Membership.ValidateUser(txtUsername.Text, txtPassword.Text);

//Authenticate the user credentials against the default membership provider specified in configuration
if (bIsValid)
{
    System.Web.Security.FormsAuthentication.SetAuthCookie(txtUsername.Text, true);

    System.Web.Security.FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true);

}
else
{
    //display error
    ....
}
4

1 回答 1

1

cookie 问题(可能是登录问题)是由于您将 cookie 路径设置为/FormsAuth. 这意味着 cookie 仅对该 URL 路径有效,否则将被丢弃。此外,您的<authorization>部分可以进行一些调整,因为我在您的部分 Web.config 的以下完整更新中进行了调整:

<connectionStrings>
    <add name="ADConnectionString" connectionString="LDAP://YNET" />
</connectionStrings>
<system.web>      
    <authentication mode="Forms">
      <forms name=".ASPXAUTH" 
             path="/"
             loginUrl="~/SignIn.aspx" 
             defaultUrl="~/Secure/Default.aspx" 
             timeout="20" 
             requireSSL="false"
             protection="All"
             slidingExpiration="true"
             cookieless="UseCookies"
             enableCrossAppRedirects="false"/>
    </authentication>

    <authorization>
      <allow users="*"/>
    </authorization>

    <!-- For non AD passthrough authentication, specify the defaultProvider property -->
    <membership defaultProvider="ActiveDirectoryMembershipProvider">
      <providers>
        <clear/>
        <add name="ActiveDirectoryMembershipProvider"
             type="System.Web.Security.ActiveDirectoryMembershipProvider"
             connectionStringName="ADConnectionString"
             attributeMapUsername="sAMAccountName"/>

       </providers>      
    </membership>
</system.web>
<location path="Secure">
    <system.web>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</location>

如果该/Secure文件夹确实是您要通过登录保护的唯一文件夹,那么上述方法有效,但如果您想锁定除登录页面之外的所有内容,您只需要<deny users "?" />在您的主要<authorization>部分中。

于 2012-11-30T05:31:31.617 回答