【问题标题】:Refresh id token before it expires in aspnet core mvc在 aspnet core mvc 中过期之前刷新 id 令牌
【发布时间】:2019-11-19 08:25:21
【问题描述】:

我正在开发一个 aspnet 核心 MVC 项目,该项目调用由 OAuth2.0 保护的 API。

我能够使用下面的代码访问 API 并正确获取响应,

Startup.cs

        public void ConfigureServices(IServiceCollection services)
        {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddCookie()
            .AddOpenIdConnect(options =>
            {
                options.Authority = Configuration["AzureAD:Instance"] + 
                 "/" + Configuration["AzureAD:TenantId"];
                options.ClientId = Configuration["AzureAD:ClientId"];
                options.Secret = Configuration["AzureAD:Secret"];
                options.Callback = Configuration["AzureAD:Callback"];
                options.ResponseType = "code id_token";
                options.SaveTokens = true;
            });

        services.AddMvc(options =>
            {
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    }

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
        app.UseCookiePolicy();
        app.UseAuthentication();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "sign-in",
                template: "signin-oidc")};


            ...

    });
    }

Controller.cs

我正在从 HttpContext 获取令牌。

但令牌会在几个小时后过期。有没有办法在 id 令牌过期之前刷新它。 我在堆栈溢出中尝试了几个示例。但没有一个对我有用。

有没有办法在不使用下面示例中使用的 IdentityModel 的情况下让它工作? https://github.com/mderriey/aspnet-core-token-renewal/blob/master/src/MvcClient/Startup.cs

【问题讨论】:

标签: asp.net-core cookies oauth-2.0 openid-connect


【解决方案1】:

您不需要刷新 id token 。 Id 令牌包含有关最终用户的信息,一旦您的客户端应用程序从 OpenID 提供程序获取 id 令牌,它将验证令牌、解码令牌并使用 cookie 身份验证登录用户。用户信息被序列化并存储在应用程序cookie中,该cookie将在浏览器的每个下一个请求中发送,以保存用户的基本个人资料信息和身份验证状态。

默认情况下,cookie 是使用基于会话的生命周期创建的 - 即,直到浏览器/选项卡关闭。所以 id 令牌会在第一时间被使用,然后 cookie 认证接管。

通常我们考虑的是如何刷新访问令牌。访问令牌允许访问某些已定义的服务器资源,我们可以在访问令牌过期后使用刷新令牌来更新访问令牌。

您提供的文章展示了如何刷新访问令牌,并将 ASP.NET 会话 cookie 的生命周期与 OIDC 访问令牌对齐(控制 cookie 的生命周期)。这与您的场景关系不大。

【讨论】:

  • 但我看到 id_token/cookie 在某个时间(可能是一个小时)后过期,之后当我尝试访问 API 时,我得到“未授权”。那么当 cookie 以 id_token 过期(因为 id_token 在 API 中使用)时,对用户进行身份验证的最佳方法是什么?
  • 否,通常访问令牌用于API。
  • 如果 cookie 过期,只需将用户重定向到 OIDC 身份验证架构进行登录
  • 谢谢南,我对这一切都很陌生,所以不太了解。 API应该使用访问令牌而不是id令牌是一般规则吗?那么 Azure 门户中的 UI 和 API 是否应该有单独的应用注册?目前它使用相同的注册。在应用注册>身份验证>高级设置> ID Token被选中,我认为这是API仅使用ID令牌的原因。
  • 最好把你的app和api注册成不同的app,access token包括权限/角色声明,用来访问web api:docs.microsoft.com/en-us/azure/active-directory/develop/…
猜你喜欢
  • 2021-11-16
  • 2019-02-10
  • 2018-03-04
  • 2021-12-05
  • 1970-01-01
  • 2016-11-12
  • 2017-10-19
  • 2021-05-01
  • 2015-07-03
相关资源
最近更新 更多