У меня есть приложение веб-API MVC 5, которое использует удостоверение Asp.net для аутентификации и авторизации. Это одностраничное приложение, и пользователь может войти в систему, используя электронную почту и пароль. Я должен показать, что сессия истекает, если пользователь некоторое время простаивает.
Я пытался использовать Session.Timeout в web.config. Это не работает, потому что мое приложение не обновится. Весь клиент связывается с сервером с помощью AJAX.
Как показать всплывающее окно окончания сеанса в зависимости от времени ожидания файлов cookie?
public void ConfigureAuth (приложение IAppBuilder)
{
string expireTimeConfig = WebConfigurationManager.AppSettings["ExpireTime"];
int expireTimeSpan = Convert.ToInt32(expireTimeConfig);
// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
CookieName = "APP",
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromMinutes(expireTimeSpan),
SlidingExpiration = true,
Provider = new CookieAuthenticationProvider()
{
// OnValidateIdentity = MyCustomValidateIdentity, //refer to the implementation below
// OnValidateIdentity = ImpersonatingSecurityStampValidator.OnValidateIdentity<UserManager, User>(
//validateInterval: TimeSpan.FromMinutes(10),
//regenerateIdentity: (manager, user) => manager.CreateIdentityAsync(user)),
OnApplyRedirect = ctx =>
{
if (!IsApiRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
},
OnResponseSignIn = ctx =>
{
var ticks = ctx.Options.SystemClock.UtcNow.AddHours(10).UtcTicks;
ctx.Properties.Dictionary.Add("absolute", ticks.ToString());
},
OnValidateIdentity = ctx =>
{
bool reject = true;
string value;
if (ctx.Properties.Dictionary.TryGetValue("absolute", out value))
{
long ticks;
if (Int64.TryParse(value, out ticks))
{
reject = ctx.Options.SystemClock.UtcNow.UtcTicks > ticks;
}
}
if (reject)
{
ctx.RejectIdentity();
// optionally clear cookie
ctx.OwinContext.Authentication.SignOut(ctx.Options.AuthenticationType);
}
return Task.FromResult(0);
}
},
});
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
if (Convert.ToBoolean(WebConfigurationManager.AppSettings["OAuth"].ToString()))
{
// Uncomment the following lines to enable logging in with third party login providers
app.UseMicrosoftAccountAuthentication(new MicrosoftAccountAuthenticationOptions
{
ClientId = WebConfigurationManager.AppSettings["microsoftClientId"].ToString(),
ClientSecret = WebConfigurationManager.AppSettings["microsoftClientSecret"].ToString(),
Scope =
{
"wl.basic", "wl.emails"
}
});
app.UseTwitterAuthentication(
consumerKey: WebConfigurationManager.AppSettings["twitterConsumerKey"].ToString(),
consumerSecret: WebConfigurationManager.AppSettings["twitterConsumerSecret"].ToString());
app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
AppId = WebConfigurationManager.AppSettings["facebookAppId"].ToString(),
AppSecret = WebConfigurationManager.AppSettings["facebookAppSecret"].ToString(),
Scope = { "email" }
});
var options = new GoogleOAuth2AuthenticationOptions
{
ClientId = WebConfigurationManager.AppSettings["googleClientId"].ToString(),
ClientSecret = WebConfigurationManager.AppSettings["googleClientSecret"].ToString(),
Provider = new GoogleOAuth2AuthenticationProvider
{
OnAuthenticated = async context =>
{
string accessToken = context.AccessToken;
// Retrieve the name of the user in Google
string googleName = context.Name;
// Retrieve the user's email address
string googleEmailAddress = context.Email;
// You can even retrieve the full JSON-serialized user
var serializedUser = context.User;
}
}
};
app.UseGoogleAuthentication(options);
app.UseLinkedInAuthentication(
clientId: WebConfigurationManager.AppSettings["linkedInClientId"].ToString(),
clientSecret: WebConfigurationManager.AppSettings["linkedInClientSecret"].ToString());
app.UseYahooAuthentication(consumerKey: WebConfigurationManager.AppSettings["yahooConsumerKey"].ToString(),
consumerSecret: WebConfigurationManager.AppSettings["yahooConsumerSecret"].ToString());
}
// app.UseKentorAuthServicesAuthentication(CreateAuthServicesOptions( ));
app.MapSignalR();
}
Как я могу прочитать ExpireTimeSpan на клиенте и показать всплывающее окно сеанса?