我是Identity Server的新手,我的理解中缺少一个关键概念。 我使用的是MVC tutorial。
中的代码如果我使用属性[Authorize]
装饰我的家庭控制器并访问我的网站,我会重定向到IdentityServer
。然后我使用我的用户名和密码登录。然后我使用一些自定义代码并进行身份验证。我得到一个AccessToken,然后我可以访问Home控制器。
我的客户端设置如下:
new Client {
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
ClientSecrets = new List<Secret>{new Secret("secret".Sha256())},
RequireConsent = false,
AccessTokenLifetime = 1,
// where to redirect to after login
RedirectUris = new List<string>{"http://localhost:5002/signin-oidc"},
// where to redirect to after logout
PostLogoutRedirectUris = new List<string>{"http://localhost:5002"},
AllowedScopes = new List<string>
{
StandardScopes.OpenId.Name,
StandardScopes.Profile.Name,
StandardScopes.OfflineAccess.Name,
}
}
我的访问令牌是
{
"nbf": 1474697839,
"exp": 1474697840,
"iss": "http://localhost:5000",
"aud": "http://localhost:5000/resources",
"client_id": "mvc",
"scope": [
"openid",
"profile"
],
"sub": "26296",
"auth_time": 1474697838,
"idp": "local",
"amr": [
"pwd"
]
}
当我将AccessTokenLifetime
设置为1时,我的令牌在被发送到API等时将被取消。不过我仍然可以访问该网站。
让MVC网站确认我的令牌未过期的最佳方法是什么?这可能是刷新令牌发挥作用的地方。
注意
设置为1的AccessTokenLifetime
仅用于测试,因此我可以快速测试。
答案 0 :(得分:1)
您将需要设置用户身份验证生存期,以匹配您的访问令牌的生存期。如果使用OpenIdConnect,则可以使用以下代码进行操作:
.AddOpenIdConnect(option =>
{
...
option.Events.OnTicketReceived = async context =>
{
// Set the expiry time to match the token
if (context?.Properties?.Items != null && context.Properties.Items.TryGetValue(".Token.expires_at", out var expiryDateTimeString))
{
if(DateTime.TryParse(expiryDateTimeString, out var expiryDateTime))
{
context.Properties.ExpiresUtc = expiryDateTime.ToUniversalTime();
}
}
};
});
我假设您正在使用cookie身份验证?如果是这样,您可能必须关闭“滑动到期时间”。滑动过期时间将在Cookie处理过期时间超过一半的请求时自动刷新。但是,访问令牌不会因此而刷新。因此,您应该让用户身份验证生存期一直持续到最后,届时它将终止,并且将使用刷新令牌自动检索新的访问令牌。
.AddCookie(options =>
{
// Do not re-issue a new cookie with a new expiration time.
// We need to let it expire to ensure we get a fresh JWT within the token lifetime.
options.SlidingExpiration = false;
})
答案 1 :(得分:0)
也许是这样吗?
var user = HttpContext.Current.User.Identity;
if (!user.IsAuthenticated)