表单身份验证在本地运行,但不在开发服务器

时间:2016-09-28 16:56:25

标签: c# asp.net-mvc iis asp.net-mvc-5 forms-authentication

我知道Forms身份验证很旧,但是当我使用IIS Express在本地运行Web应用程序时,一切都运行良好。但是当我将它发布到我们的开发/测试服务器时,它只是重新加载页面。开发服务器正在运行IIS 6.

还有一点需要注意,本地它以localhost运行:50264 / Login。在开发服务器上,网址更像http://dev1.server.com/op/webapp/Account/Login

我注意到两个cookie都有路径" /"。我确实尝试通过在我的本地web.config中设置更改:

<add key="CookiePath" value="/" /> 

然后当我发布到我们的开发服务器时,它改为:

<add key="CookiePath" value="http://dev1.server.com/op/webapp/" xdt:Transform="Replace" xdt:Locator="Match(key)" />

这似乎不起作用。

在Stack Overflow中找到的另一个帖子中,有人建议将其添加到:

<system.webServer>
    <modules>
        <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
    </modules>
</system.webServer>

那也没有用。任何帮助将不胜感激!

更新时间:2016年9月29日

我删除了CookiePath应用设置,而是对身份验证节点进行了调整。在我的Web.config中,我现在有:

<authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" requireSSL="false" slidingExpiration="true" path="/" />
</authentication>

在我的Web.Debug.config中,我有:

<authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" requireSSL="false" slidingExpiration="true" path="/op" xdt:Transform="Replace" />
</authentication>

最后,当我创建cookie时:

var authTicket = new FormsAuthenticationTicket(
    1,
    user.Email,
    DateTime.Now,
    DateTime.Now.AddDays(14),
    true,
    userData,
    FormsAuthentication.FormsCookiePath);

当我部署到开发服务器时,我检查了web.config,它确实正确地转换了表单节点。

当我登录时,我输入了我的凭据,它仍然刷新了登录页面。使用Chrome扩展程序&#34; EditThisCookie&#34;我仍然看到cookie的路径是&#34; /&#34;。它并没有认识到所有的变化。即使我手动将authTicket路径设置为&#34; / op&#34; Cookie STILL的路径为&#34; /&#34;。我不知道发生了什么。啊...

2 个答案:

答案 0 :(得分:1)

我也使用表单身份验证,这是我的设置。您没有显示所有表单身份验证代码,但希望这会指出您正确的方向。

的Web.Config

<authentication mode="Forms">
  <forms loginUrl="members/login.aspx" name=".ASPXFORMSAUTH" requireSSL="false" slidingExpiration="true" timeout="120" />
</authentication>

然后我在用户登录时在代码中设置cookie。

  Dim authCookie As HttpCookie = FormsAuthentication.GetAuthCookie(iMembersID, False)
  Dim ticket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value)
  Dim newTicket As FormsAuthenticationTicket = New FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, "Member")
  authCookie.Value = FormsAuthentication.Encrypt(newTicket)
  Response.Cookies.Add(authCookie)

然后我测试是否在要求用户登录的所有页面上进行身份验证。

    If Request.IsAuthenticated Then
        Dim ident As FormsIdentity = CType(User.Identity, FormsIdentity)
        If ident IsNot Nothing Then

            Dim ticket As FormsAuthenticationTicket = ident.Ticket
            Dim userDataString As String = ticket.UserData

            Select Case ticket.UserData
                Case "Member"
                    m_MemberLoggedIn = ident.Name
                Case Else
                    Response.Redirect("~/members/login/", True)
            End Select


        Else
            Response.Redirect("~/members/login/", True)
        End If

更新9月29日:

检查以确保IIS身份验证模式设置为匿名

答案 1 :(得分:1)

我轻松地走了出去,并要求我们的IT部门创建一个子域,因此cookie的路径始终是&#34; /&#34;。不是答案,而是我所做的。