Andy Lanng Ответов: 1

Авто выход для избавления от авторизованных пользователей


Эй,

Я задал подобный вопрос пару дней назад,но я не вижу такого же эффекта, как описано.

По сути, я использую ASP с аутентификацией формы. Я управляю пользователями с помощью поставщика членства, но он был довольно широко настроен.

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

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

Я предполагал, и мне сообщили, что, когда пользователь переходит на новую страницу после потери авторизации, asp снова проверяет разрешения пользователей. Это не.

Нужно ли добавлять чеки на каждую страницу или мне не хватает какой-то настройки?

Любой совет приветствуется ^_^

Спасибо
Энди

Что я уже пробовал:

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

Мы можем проверять авторизацию при каждой загрузке страницы, но я слышал, что это делается автоматически. Есть ли настройка или простое приложение для широкого исправления?

1 Ответов

Рейтинг:
6

Richard Deeming

При проверке подлинности форм единственное, что проверяется для каждого запроса, - это то, что файл cookie содержит действительный билет проверки подлинности форм и что срок действия билета не истек.

Если вы хотите проверить, что билет все еще представляет действительного пользователя в вашем магазине членства, то вам нужно добавить этот чек к каждому запросу. Самое простое решение, вероятно, использовать обычай IHttpModule:

public sealed class MembershipValidationModule : IHttpModule
{
    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        if (context == null) throw new ArgumentNullException(nameof(context));

        context.PostAuthenticateRequest += (s, e) =>
        {
            var app = s as HttpApplication;
            if (app?.Context != null)
            {
                OnAuthenticated(new HttpContextWrapper(app.Context));
            }
        };
    }

    private static void OnAuthenticated([NotNull] HttpContextBase context)
    {
        if (IsFormsAuthenticated(context.User))
        {
            var user = Membership.GetUser();
            if (user == null || !user.IsApproved)
            {
                FormsAuthentication.SignOut();
                context.User = null;
            }
        }
    }

    private static bool IsFormsAuthenticated(IPrincipal user)
    {
        if (user == null || !user.Identity.IsAuthenticated) return false;
        return string.Equals(user.Identity.AuthenticationType, "Forms", StringComparison.OrdinalIgnoreCase);
    }
}

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
        
        <modules>
            <add

                name="MembershipValidationModule"

                preCondition="managedHandler"

                type="YourNamespace.MembershipValidationModule, YourAssembly"

            />
        </modules>
    </system.webServer>
</configuration>


Andy Lanng

Потрясающе! Спасибо ^_^