开发手册 欢迎您!
软件开发者资料库

ASP.NET Core Identity Server 3自定义修改Token过期刷新时间

本文主要介绍ASP.NET Core使用Identity Server 3时,要自定义修改Token刷新时间的方法,以方便实现针对不同用户指定不同的Token过期刷新时间。

1、自定义DefaultRefreshTokenService类刷新Token

Identity Server 3的默认实现类,可以参考根据自己的需求,自定义实现:DefaultRefreshTokenService源代码

下面的MyDefaultRefreshTokenService类重写CreateRefreshTokenAsync方法,来实现针对不同用户设置不同的刷新时间(过期时间),另外,MyDefaultRefreshTokenService类项目中还要引用IdentityModel,直接Nuget中安装IdentityModel即可。

相关文档VS(Visual Studio)中Nuget的使用

using IdentityModel;using IdentityServer3.Core.Logging;using IdentityServer3.Core.Models;using IdentityServer3.Core.Services;using IdentityServer3.Core.Services.Default;using System;using System.Collections.Generic;using System.Linq;using System.Security.Claims;using System.Threading.Tasks;namespace Host.AspNetCore{    public class MyDefaultRefreshTokenService : DefaultRefreshTokenService    {        private readonly static ILog Logger = LogProvider.GetCurrentClassLogger();        public MyDefaultRefreshTokenService(IRefreshTokenStore store, IEventService events) : base(store, events)        {        }        public override async Task CreateRefreshTokenAsync(ClaimsPrincipal subject, Token accessToken, Client client)        {           // return base.CreateRefreshTokenAsync(subject, accessToken, client);            Logger.Debug("Creating refresh token");            int lifetime;            //这里可以根据需求,不同的用户设置不同的token刷新时间            if (client.RefreshTokenExpiration == TokenExpiration.Absolute)            {                Logger.Debug("Setting an absolute lifetime: " + client.AbsoluteRefreshTokenLifetime);                lifetime = client.AbsoluteRefreshTokenLifetime;            }            else            {                Logger.Debug("Setting a sliding lifetime: " + client.SlidingRefreshTokenLifetime);                lifetime = client.SlidingRefreshTokenLifetime;            }            var handle = CryptoRandom.CreateUniqueId();            var refreshToken = new RefreshToken            {                CreationTime = DateTimeOffset.UtcNow,                LifeTime = lifetime,                AccessToken = accessToken,                Subject = subject            };            await _store.StoreAsync(handle, refreshToken);            await RaiseRefreshTokenIssuedEventAsync(handle, refreshToken);            return handle;        }    }}

2、Startup.cs中配置RefreshTokenService

RefreshTokenService配置为MyDefaultRefreshTokenService

public void Configure(IApplicationBuilder app, IHostingEnvironment host)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.File(@"c:\logs\idsvrlog.txt")
.CreateLogger();
app.Map("/core", coreApp =>
{
var factory = new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get())
.UseInMemoryUsers(Users.Get());
var refreshTokenService = new MyDefaultRefreshTokenService(new InMemoryRefreshTokenStore(), new DefaultEventService());
factory.RefreshTokenService = new Registration(resolver => refreshTokenService);
var options = new IdentityServerOptions
{
SiteName = "IdentityServer3 - AspNet Core",
SigningCertificate = Certificate.Get(host.ContentRootPath),
Factory = factory,
};
coreApp.UseIdentityServer(options);
});
}