У меня есть приложение Blazor Server, которое использует файлы cookie в качестве схемы по умолчанию и OpenIdConnect в качестве схемы задач. В приложении также используется распределенный кэш SQL Server для реализации IticketStore . Токен доступа имеет срок службы 48 часов, а токен обновления 30 дней.services.AddOptions(CookieAuthenticationDefaults.AuthenticationScheme)
.Configure((options, store) =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(14);
options.SlidingExpiration = true;
options.SessionStore = store;
});
< /code>
и аутентификация: < /p>
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Authority = authority;
options.ClientId = clientId;
options.ClientSecret = clientSecret;
options.ResponseType = OpenIdConnectResponseType.Code;
options.ResponseMode = OpenIdConnectResponseMode.FormPost;
options.GetClaimsFromUserInfoEndpoint = true;
options.MapInboundClaims = false;
options.SaveTokens = true;
options.UseTokenLifetime = false;
options.UseSecurityTokenValidator = true;
options.Scope.Add(OpenIdConnectScope.OpenIdProfile);
options.Scope.Add(OpenIdConnectScope.Email);
options.Scope.Add(OpenIdConnectScope.OfflineAccess);
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
};
});
< /code>
Войдите в систему: < /p>
public async Task OnGet(string redirectUri)
{
await HttpContext.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties
{
RedirectUri = redirectUri,
IsPersistent = true,
});
}
Каждый раз, когда пользователь обращается к приложению, в кэше добавляется новый элемент, а в кэше добавляется новый элемент. /> iticketstore < /code> реализация: < /p>
public class AuthenticationTicketStore(
IDistributedCache cache,
ILogger logger) : ITicketStore
{
private const string KeyPrefix = "AuthSessionStore-";
private readonly TicketSerializer ticketSerializer = TicketSerializer.Default;
public async Task StoreAsync(AuthenticationTicket ticket)
{
var key = $"{KeyPrefix}{Guid.NewGuid():N}";
await RenewAsync(key, ticket);
return key;
}
public Task RenewAsync(string key, AuthenticationTicket ticket)
{
if (ticket == null)
{
throw new ArgumentNullException(nameof(ticket));
}
var options = new DistributedCacheEntryOptions();
var expiresUtc = ticket.Properties.ExpiresUtc;
if (expiresUtc.HasValue)
{
options.SetAbsoluteExpiration(expiresUtc.Value);
}
if (ticket.Properties.AllowRefresh ?? false)
{
options.SetSlidingExpiration(TimeSpan.FromMinutes(60));
}
return cache.SetAsync(key, ticketSerializer.Serialize(ticket), options);
}
public async Task RetrieveAsync(string key)
{
var value = await cache.GetAsync(key);
return value != null ? ticketSerializer.Deserialize(value) : null;
}
public Task RemoveAsync(string key) => cache.RemoveAsync(key);
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... ion-ticket
Cookieauthentication продолжает воссоздать билет на печенье и аутентификацию ⇐ C#
Место общения программистов C#
1751446834
Anonymous
У меня есть приложение Blazor Server, которое использует файлы cookie в качестве схемы по умолчанию и OpenIdConnect в качестве схемы задач. В приложении также используется распределенный кэш SQL Server для реализации IticketStore . Токен доступа имеет срок службы 48 часов, а токен обновления 30 дней.services.AddOptions(CookieAuthenticationDefaults.AuthenticationScheme)
.Configure((options, store) =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(14);
options.SlidingExpiration = true;
options.SessionStore = store;
});
< /code>
и аутентификация: < /p>
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Authority = authority;
options.ClientId = clientId;
options.ClientSecret = clientSecret;
options.ResponseType = OpenIdConnectResponseType.Code;
options.ResponseMode = OpenIdConnectResponseMode.FormPost;
options.GetClaimsFromUserInfoEndpoint = true;
options.MapInboundClaims = false;
options.SaveTokens = true;
options.UseTokenLifetime = false;
options.UseSecurityTokenValidator = true;
options.Scope.Add(OpenIdConnectScope.OpenIdProfile);
options.Scope.Add(OpenIdConnectScope.Email);
options.Scope.Add(OpenIdConnectScope.OfflineAccess);
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
};
});
< /code>
Войдите в систему: < /p>
public async Task OnGet(string redirectUri)
{
await HttpContext.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties
{
RedirectUri = redirectUri,
IsPersistent = true,
});
}
Каждый раз, когда пользователь обращается к приложению, в кэше добавляется новый элемент, а в кэше добавляется новый элемент. /> iticketstore < /code> реализация: < /p>
public class AuthenticationTicketStore(
IDistributedCache cache,
ILogger logger) : ITicketStore
{
private const string KeyPrefix = "AuthSessionStore-";
private readonly TicketSerializer ticketSerializer = TicketSerializer.Default;
public async Task StoreAsync(AuthenticationTicket ticket)
{
var key = $"{KeyPrefix}{Guid.NewGuid():N}";
await RenewAsync(key, ticket);
return key;
}
public Task RenewAsync(string key, AuthenticationTicket ticket)
{
if (ticket == null)
{
throw new ArgumentNullException(nameof(ticket));
}
var options = new DistributedCacheEntryOptions();
var expiresUtc = ticket.Properties.ExpiresUtc;
if (expiresUtc.HasValue)
{
options.SetAbsoluteExpiration(expiresUtc.Value);
}
if (ticket.Properties.AllowRefresh ?? false)
{
options.SetSlidingExpiration(TimeSpan.FromMinutes(60));
}
return cache.SetAsync(key, ticketSerializer.Serialize(ticket), options);
}
public async Task RetrieveAsync(string key)
{
var value = await cache.GetAsync(key);
return value != null ? ticketSerializer.Deserialize(value) : null;
}
public Task RemoveAsync(string key) => cache.RemoveAsync(key);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79535525/cookieauthentication-keeps-recreating-the-cookie-and-authentication-ticket[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия