【问题标题】:How to refresh access token如何刷新访问令牌
【发布时间】:2018-09-25 21:18:32
【问题描述】:

我有一个 Asp.net 2.0 核心 Web 应用程序,它连接到 Identity server 4 应用程序以进行身份​​验证。还涉及一个 API。 API 使用访问令牌作为不记名令牌。

我的创业:

services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";
                options.Authority = idsEndPoint;
                options.RequireHttpsMetadata = false;
                options.ClientId = "testclient";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;
                options.Scope.Add("testapi");
            });

控制器:

在我的控制器中,我可以看到我的令牌,它们都已填充,我可以在我的 API 调用中使用访问令牌。

var accessToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken);
var refreshToken = await HttpContext.GetTokenAsync(IdentityConstants.HttpContextHeaders.RefreshToken);
var idToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.IdToken);

问题:

我的问题是在访问令牌过期一小时后出现的。似乎它不会自动刷新。我想知道这是否是我的身份验证中的一个设置,会导致它刷新它。但是我一直无法找出我应该如何强制它在访问令牌过期后刷新它。

我目前的解决方案是自己刷新它,但我原以为这会内置到 cookie 中间件中。

【问题讨论】:

  • 如何使用 OpenId Connect 的刷新令牌处理 asp.net 核心中过期的访问令牌:stackoverflow.com/questions/40032851/…
  • @HoussemRomdhani 不错的尝试,但那是我的旧应用程序使用的 .net core 2.0,所以 1.1x 不再起作用
  • 哇,这看起来很有用,谢谢。我会尽快回复您。无论如何,您都可能希望将其添加为答案。
  • .net 核心是否没有改进来自动管理这个?

标签: c# asp.net-core oauth .net-core identityserver4


【解决方案1】:

对于自动刷新令牌,将options.Scope.Add("offline_access"); 添加到AddOpenIdConnect() 选项。

【讨论】:

    【解决方案2】:

    这种方式使用OpenIddict,需要在startup.cs里面实现主要配置。下一个链接是这种实现的一个很好的例子。希望有用
    https://github.com/openiddict/openiddict-samples/tree/dev/samples/RefreshFlow

         if (request.IsPasswordGrantType())
            {
    
                if (!Email_Regex_Validation.Check_Valid_Email_Regex(request.Username))
                {
                    return BadRequest(Resources.RegexEmail);
                }
    
                SpLoginUser stored = new SpLoginUser(_context);
    
                string result = stored.Usp_Login_User(request.Username, request.Password);
    
                if (!result.Contains("successfully"))
                {
                    return Forbid(OpenIddictServerDefaults.AuthenticationScheme);
                }
    
                // Create a new ClaimsIdentity holding the user identity.
                var identity = new ClaimsIdentity(
                    OpenIddictServerDefaults.AuthenticationScheme,
                    OpenIdConnectConstants.Claims.Name,
                    OpenIdConnectConstants.Claims.Role);
    
    
                identity.AddClaim(Resources.issuer, Resources.secret,
                    OpenIdConnectConstants.Destinations.IdentityToken);
                identity.AddClaim(OpenIdConnectConstants.Claims.Name, request.Username,
                    OpenIdConnectConstants.Destinations.IdentityToken);
    
    
                var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), new AuthenticationProperties(), OpenIdConnectServerDefaults.AuthenticationScheme);
                ticket.SetScopes(OpenIdConnectConstants.Scopes.OfflineAccess);
    
                // Ask OpenIddict to generate a new token and return an OAuth2 token response.
                return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
    
            }
    

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 2020-11-09
      • 2019-11-30
      • 2014-09-13
      • 2019-06-29
      • 2018-01-25
      • 1970-01-01
      • 2016-08-13
      • 2016-09-23
      相关资源
      最近更新 更多