Azure B2C 持久性 Cookie
Azure B2C Persistent Cookie
我正在使用 Azure B2C,并配置了一个身份提供者 (LinkedIn)。我有一个 Web API (b2c bearer auth) 和一个 Web App MVC (b2c Open Id)。
我正在尝试创建持久登录 - 这意味着用户可以每 90 天从给定的设备+浏览器通过 LinkedIn 登录一次。
我最接近的是在网络应用程序中添加 IsPersistent = true 代码以启用它:
更新:更新了基于 Azure B2C GA 的代码。为了达到预览版的效果,我仍然使用自定义授权属性,但代码已更新:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.HttpContext.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties()
{
IsPersistent = true
});
base.HandleUnauthorizedRequest(filterContext);
}
但是,这仅在大约 1 小时内有效。也许它遵循访问和 ID 策略?刷新令牌没有限制 - 我不确定为什么 "IsPersistent".
只有 1 小时
所以这导致了这些问题:
- 我可以使用 Azure B2C (OpenId Connect) 实现持久会话(60-90 天)吗?
- 如果是这样,有什么关于我遗漏的指示吗?我需要做一些自定义 cookie 验证吗?带有刷新令牌的东西(我将它们用于网络 api,但在网络应用程序中没有自定义)。
任何想法或意见都会很棒!
在执行以下操作后,我已经能够实现与 B2C 的持久会话:
自定义授权属性
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.HttpContext.GetOwinContext()
.Authentication.Challenge(
new AuthenticationProperties() { IsPersistent = true }
);
base.HandleUnauthorizedRequest(filterContext);
}
使用 Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory 而不是 BootstrapContext(基本上与 pre-GA 代码示例一起使用(查看更改历史记录)-> https://github.com/AzureADQuickStarts/B2C-WebApp-WebAPI-OpenIDConnect-DotNet)。 ADAL 库处理获取对我的代码透明的正确令牌。
实现了自定义 TokenCache(基于此处的 EFADAL 示例:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-multitenant-openidconnect/blob/master/TodoListWebApp/DAL/EFADALTokenCache.cs)
已更改 Startup.Auth.cs:
return new OpenIdConnectAuthenticationOptions
{
MetadataAddress = String.Format(aadInstance, tenant, policy),
AuthenticationType = policy,
UseTokenLifetime = false,
ClientId = clientId,
RedirectUri = redirectUri,
PostLogoutRedirectUri = redirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
AuthorizationCodeReceived = OnAuthorizationCodeReceived,
},
Scope = "openid offline_access",
ResponseType = "code id_token",
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
SaveSigninToken = true,
},
}
我正在使用 Azure B2C,并配置了一个身份提供者 (LinkedIn)。我有一个 Web API (b2c bearer auth) 和一个 Web App MVC (b2c Open Id)。
我正在尝试创建持久登录 - 这意味着用户可以每 90 天从给定的设备+浏览器通过 LinkedIn 登录一次。
我最接近的是在网络应用程序中添加 IsPersistent = true 代码以启用它:
更新:更新了基于 Azure B2C GA 的代码。为了达到预览版的效果,我仍然使用自定义授权属性,但代码已更新:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.HttpContext.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties()
{
IsPersistent = true
});
base.HandleUnauthorizedRequest(filterContext);
}
但是,这仅在大约 1 小时内有效。也许它遵循访问和 ID 策略?刷新令牌没有限制 - 我不确定为什么 "IsPersistent".
只有 1 小时所以这导致了这些问题:
- 我可以使用 Azure B2C (OpenId Connect) 实现持久会话(60-90 天)吗?
- 如果是这样,有什么关于我遗漏的指示吗?我需要做一些自定义 cookie 验证吗?带有刷新令牌的东西(我将它们用于网络 api,但在网络应用程序中没有自定义)。
任何想法或意见都会很棒!
在执行以下操作后,我已经能够实现与 B2C 的持久会话:
自定义授权属性
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { filterContext.HttpContext.GetOwinContext() .Authentication.Challenge( new AuthenticationProperties() { IsPersistent = true } ); base.HandleUnauthorizedRequest(filterContext); }
使用 Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory 而不是 BootstrapContext(基本上与 pre-GA 代码示例一起使用(查看更改历史记录)-> https://github.com/AzureADQuickStarts/B2C-WebApp-WebAPI-OpenIDConnect-DotNet)。 ADAL 库处理获取对我的代码透明的正确令牌。
实现了自定义 TokenCache(基于此处的 EFADAL 示例:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-multitenant-openidconnect/blob/master/TodoListWebApp/DAL/EFADALTokenCache.cs)
已更改 Startup.Auth.cs:
return new OpenIdConnectAuthenticationOptions { MetadataAddress = String.Format(aadInstance, tenant, policy), AuthenticationType = policy, UseTokenLifetime = false, ClientId = clientId, RedirectUri = redirectUri, PostLogoutRedirectUri = redirectUri, Notifications = new OpenIdConnectAuthenticationNotifications { AuthenticationFailed = OnAuthenticationFailed, AuthorizationCodeReceived = OnAuthorizationCodeReceived, }, Scope = "openid offline_access", ResponseType = "code id_token", TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name", SaveSigninToken = true, }, }