我有一个使用 Azure B2C 身份验证的 MVC 应用 ASP.Net,以及用于授权用户访问部分应用的标识角色。 但是,存在一个问题,即大约一个小时后,角色似乎超时。 我目前的理论是,由于它使用 cookie 身份验证,cookie 即将过期,因此角色被撤回。
配置此代码在此处:
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
CookieManager = new SystemWebCookieManager(),
SlidingExpiration = true
});
app.UseOpenIdConnectAuthentication( ...
请注意,此处未设置ExpireTimeSpan
。 声明添加在此处:
public class MvcApplication : HttpApplication
{
void Application_PostAuthenticateRequest()
{
...
if (Request.IsAuthenticated)
{
var identity = ClaimsPrincipal.Current.Identities.First();
var myClaim = new Claim("Role", "admin");
identity.AddClaim(myClaim);
...
超时后,ClaimsPrincipal.Current.Claims
为空;因此,我添加的自定义声明以及MS发出的声明(例如名称标识符(。 它是如何被清除的,告诉它何时清除的设置(假设它是一个设置(在哪里?
我想问题出在设置
SlidingExpiration = true
未设置
UseTokenLifetime = false
(在 OpenIdConnectAuthenticationOptions(
由身份提供商颁发的 id 令牌将在一小时内过期(而 Cookie 不会过期(。并且不能在本地重新发行。应执行新的质询(往返 IdP(以获取新令牌。实际上,您解释的行为(在某些时候仍然经过身份验证但错过了所有cookie(看起来有问题,但解释可能还不够完整。
无论如何,如果要延长标识令牌生存期,可以更改 IdP 中的设置(但不确定 Azure B2C 是否提供此类设置(,在OpenIdConnectAuthenticationOptions
中设置UseTokenLifetime = false
,或在外部身份验证回调时颁发自己的令牌(包含所需的所有 Cookie 和所需的生存期(。但是,再一次,最简单的方法是关闭滑动,依靠您的外部 IdP 并在旧令牌过期时选择新令牌。