【发布时间】:2014-12-15 12:03:06
【问题描述】:
这个想法是设置不同的会话超时值 ASP.NET MVC 5 和 ASP.NET Identity 中的不同用户角色。
可以吗?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-5 asp.net-identity roles session-timeout
这个想法是设置不同的会话超时值 ASP.NET MVC 5 和 ASP.NET Identity 中的不同用户角色。
可以吗?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-5 asp.net-identity roles session-timeout
如果您想比普通用户更早地启动管理员,这是我在 Identity 中的存根。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
// other stuff
Provider = new CookieAuthenticationProvider
{
// this function is executed every http request and executed very early in the pipeline
// and here you have access to cookie properties and other low-level stuff.
// makes sense to have the invalidation here
OnValidateIdentity = async context =>
{
// invalidate user cookie if user's security stamp have changed
var invalidateBySecirityStamp = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager));
await invalidateBySecirityStamp.Invoke(context);
// check if user is in admin role
var isAdmin = context.Identity.Claims.Any(c => c.Type == ClaimTypes.Role && c.Value == "AdminRoleName");
// check if enough time has passed to invalidate cookie
var currentUtc = DateTimeOffset.UtcNow;
if (context.Options != null && context.Options.SystemClock != null)
{
currentUtc = context.Options.SystemClock.UtcNow;
}
var issuedUtc = context.Properties.IssuedUtc;
var bootThemOut = (issuedUtc == null);
if (issuedUtc != null)
{
var timeElapsed = currentUtc.Subtract(issuedUtc.Value);
bootThemOut = timeElapsed > TimeSpan.FromMinutes(3); // invalidate admin cookies in 3 minutes
}
if (isAdmin && bootThemOut)
{
context.RejectIdentity();
context.OwinContext.Authentication.SignOut(context.Options.AuthenticationType);
}
}
}
});
【讨论】:
SlidingExpiration = true 行为?
SecurityStamp 字段并将validateInterval 设置为足够小以匹配您的“立即”要求。虽然我不建议将其设置为少于几秒。
根据他们的角色,您可以设置超时,即
HttpContext.Current.Session.Timeout = 20;
按照您之前的问题,您希望动态执行此操作。您可以在会话中自己存储和更新时间,并在基本控制器的OnActionExecuting 上为每个角色设置。
if (User.IsInRole("Admin"))
{
filterContext.HttpContext.Session.Timeout =
(int)filterContext.HttpContext.Session["AdminTimeoutThatYouSetSomewhereElseGlobally"];
}
【讨论】: