Azure B2C持久性Cookie

时间:2016-07-21 17:26:08

标签: azure-active-directory azure-ad-b2c

我正在使用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小时有效。也许它是跟随Access&身份证政策?没有刷新令牌的界限 - 我不确定为什么“IsPersistent”只有1个小时。

Token Session Config in Azure

因此导致了这些问题:

  1. 使用Azure B2C(OpenId Connect)可以实现持久会话(60-90天)吗?
  2. 如果是这样,关于我遗失的任何指示?我是否需要进行一些自定义cookie验证?刷新令牌的东西(我将它们用于web api,但在Web应用程序中没有自定义)。
  3. 任何想法或输入都会很棒!

1 个答案:

答案 0 :(得分:1)

执行以下操作后,我已经能够与B2C建立持久会话:

  1. 自定义授权属性

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { filterContext.HttpContext.GetOwinContext().Authentication.Challenge( new AuthenticationProperties() { IsPersistent = true }); base.HandleUnauthorizedRequest(filterContext); }

  2. 使用Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory而不是BootstrapContext(基本上使用了GA前代码示例(查看更改历史记录) - > https://github.com/AzureADQuickStarts/B2C-WebApp-WebAPI-OpenIDConnect-DotNet)。 ADAL库处理获取对我的代码透明的正确令牌。

  3. 实施自定义TokenCache(基于EFADAL示例:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-multitenant-openidconnect/blob/master/TodoListWebApp/DAL/EFADALTokenCache.cs

  4. 更改了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,
    
        },
    }