ASP.NET Идентификация и проверка пользовательской заявки

Я использую ASP.NET Identity с MVC, и я устанавливаю sessionId (строка GuId) для каждого вошедшего в систему пользователя для каждого из его устройств. Идея состоит в том, что пользователь может удалить сеансы устройства, и тогда это устройство больше не будет входить в систему (как это делается в dropbox и в Google).

В настоящее время я установил этот sessionId как утверждение в ASP.NET Identity, чтобы он передавался в файле cookie аутентификации.

Для аутентификации я использую ASP.NET Identity в качестве примеров: app.UseCookieAuthentication(new CookieAuthenticationOptions{....

Мои вопросы:

  1. Правильный ли здесь подход к настройке sessionId для утверждений?

  2. Кроме того, где во всем процессе аутентификации я могу проверить утверждение этого sessionId?

  3. Моя текущая идея состоит в том, чтобы проверять этот sessionId по таблице базы данных для каждого запроса. Должен ли я использовать Request.Sessions для хранения sessionId вместо этого, или любая другая идея здесь?

Спасибо,

1 ответ

Решение

Поскольку у пользователя может быть несколько действительных сеансов, вам нужно будет либо сохранить их как утверждения, либо создать собственную таблицу для их хранения. Поскольку заявки уже созданы Identity, это будет проще всего.

Вы подтвердите это в OnValidateIdentity метод CookieAuthenticationProvider в Startup.Auth.cs, В настоящее время это называется OnValidateIdentity метод SecurityStampValidator поэтому вам нужно написать метод-обертку, который сначала проверяет идентификатор вашего сеанса, а затем вызывает исходный валидатор меток безопасности. Например, вы можете добавить эти методы в Startup учебный класс:

private Func<CookieValidateIdentityContext, System.Threading.Tasks.Task> _validate=SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
           validateInterval: TimeSpan.FromMinutes(30),
           regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager));
private async Task validate(CookieValidateIdentityContext context)
{
    var usermanager = context.OwinContext.GetUserManager<ApplicationUserManager>();
    var claims = await usermanager.GetClaimsAsync(context.Identity.GetUserId());

    //instead of setting to true, add your session validation logic here
    bool sessionIsValid=true;

    if (!sessionIsValid) {
        context.RejectIdentity();
        context.OwinContext.Authentication.SignOut(context.Options.AuthenticationType);
    }

    await _validate(context);
}

где _validate это просто оригинальный метод и validate это ваш новый метод, который также проверяет идентификатор сессии. Тогда ваш app.UseCookieAuthentication код будет ссылаться на новый validate метод как это:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = validate

    }
});  

Я думаю, что для этого вам нужно каждый раз проверять заявки из базы данных, но я считаю, что usermanager.GetClaimsAsync в конечном итоге сделает это.

Другие вопросы по тегам