Клиенты должны удалить куки в большинстве случаев в MVC - PullRequest
1 голос
/ 20 октября 2011

У меня есть проект MVC, который отлично работает на моей локальной машине. Тем не менее, после публикации на сервере пользователи не могут получить доступ к логину, пока они пытаются получить доступ к веб-сайту. Они должны удалить куки. Почему это так? Как я могу это исправить?

Global.asax.cs

 FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.cookies[FormsAuthentication.FormsCookieName].Value);
 args.user = new MyProject.Web.UI.Classes.UserPrincipal(GetUserFromCache(ticket.Name))

Исходный файл: c: \ Myproject \ Code \ MvcUI \ Global.asax.cs

    public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
    {
        if (FormsAuthentication.CookiesSupported)
        {
            if (null != Request.Cookies[FormsAuthentication.FormsCookieName])
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
                args.User = new MyProject.Web.UI.Classes.UserPrincipal(GetUserFromCache(ticket.Name));
            }
        }
        else
            throw new HttpException("Cookieless Forms Authentication is not supported for this application.");
    }

    public void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs args)
    {
        string username = args.Identity.Name.Substring(args.Identity.Name.IndexOf("\\") + 1);
        Myproject.API.User user = GetUserFromCache(username);

        if (null == user)
            throw new HttpException("User could not be found.");

        args.User = new MyProject.Web.UI.Classes.UserPrincipal(user);
    }

AccountController

[HttpPost]
        public bool LogOn(string userName, string password, string returnUrl, bool rememberMe = false)
        {
            MyProject.API.User user = MyProject.API.User.Load(userName);
            string errorMessage = "Your user name and/or password is incorrect.";
            if (null != user && user.IsValidPassword(password))
            {
                user.LastLoginDate = DateTime.Now;
                user.Save();
                FormsAuthentication.SetAuthCookie(userName, rememberMe);
                return true;
            }
            else
                throw new Exception(errorMessage);
        }

web.config

    <?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->

<configuration>
    <configSections>
        <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
            <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
        </sectionGroup>
    </configSections>

    <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
            <namespaces>
                <add namespace="System.Web.Mvc" />
                <add namespace="System.Web.Mvc.Ajax" />
                <add namespace="System.Web.Mvc.Html" />
                <add namespace="System.Web.Routing" />
                <add namespace="MvcUI.HtmlHelpers" />
                <add namespace="MyProject.API" />
                <add namespace="MvcUI.Models" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>


    <connectionStrings>
    <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

  <appSettings>
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
                <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
                <add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
                <add assembly="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
      </assemblies>
            <buildProviders>
                <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            </buildProviders>
    </compilation>

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>

    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
      </providers>
    </profile>

    <roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>

    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
        <httpHandlers>
            <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        validate="false" />
        </httpHandlers>
  </system.web>

    <nhibernate>
        <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
        <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect"/>
        <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
        <add key="hibernate.connection.connection_string" value="Server=.\SQLEXPRESS;Database=myDatabase;User=me;Pwd=password;"/>
        <add key="hibernate.show_sql" value="false"/>
    </nhibernate>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
        <handlers>
            <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </handlers>
  </system.webServer>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Модель аккаунта

    public interface IFormsAuthenticationService
{
    void SignIn(string userName, bool createPersistentCookie);
    void SignOut();
}

public class FormsAuthenticationService : IFormsAuthenticationService
{
    public void SignIn(string userName, bool createPersistentCookie)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");

        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }

    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }
}

Сообщение об ошибке указывает на файл Gloabal.asax.cs и показано выше. Сообщение об ошибке: enter image description here enter image description here


Я также включил сгенерированный машинный ключ, но он не решил проблему,

Ответы [ 5 ]

2 голосов
/ 25 октября 2011

Исходя из ваших отзывов, причиной возникновения этой ошибки может быть то, что вы используете автоматически сгенерированный machineKey для своего приложения (также возможно в нескольких машинах / пулах приложений или даже водин пул приложений, который перезагружается слишком часто).

Пожалуйста, убедитесь, что отметили этот .

1 голос
/ 28 октября 2011

Применяли ли вы этот патч ?

Я вижу, вы не установили ticketCompatibilityMode, так как .net 4 изменил способ шифрования.

<forms 
    loginUrl="/Login.aspx" 
    timeout="2880" 
    ticketCompatibilityMode="Framework20"
    domain="domain.com"/>

Убедитесь, что у вас одинаковые машинные клавиши в обеих системах. Убедитесь, что вы также применили этот патч .

Поскольку исправление изменяет поведение шифрования / подписывания определенных функций в ASP.NET, важно применять его ко всем компьютерам в веб-ферме. Если у вас есть смешанное совпадение исправленных / непропатченных систем, у вас будут запросы Form-authentication, webresource.axd и scriptresource.axd успешно / неуспешно, в зависимости от того, на какой сервер они попадают в ферму (поскольку используемое шифрование будет разные по ним).

0 голосов
/ 21 ноября 2011

Спасибо всем вам за попытку ответить на вопрос. На самом деле они все были полезны. Я сам решил проблему, добавив в wenconfig машинный ключ, а также имя формы без имени формы, даже ключ машины был бесполезен

0 голосов
/ 17 ноября 2011

На GET (не пост) метода действия LogOn.Проверьте, аутентифицирован ли пользователь, и выйдите из системы, если это так.

if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{
     FormsAuthentication.SignOut();
}
0 голосов
/ 24 октября 2011

Я предполагаю, что ваши пользователи перенаправляются куда-то после достижения страницы входа в систему, если запрос аутентифицирован и , таким образом они не могут получить доступ к странице входа после первого успешного входа.

В этом случае вы можете заставить своих пользователей выходить из системы при достижении страницы входа в систему при первой загрузке страницы. Например (синтаксис Razor, C #):

@if (!IsPost && Request.IsAuthenticated)
{
    FormsAuthentication.SignOut();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...