当前位置: 首页 > 知识库问答 >
问题:

ASP Web API如何在Http请求授权期间使用刷新令牌生成新令牌

向子安
2023-03-14

我正在我的 asp.net Web API 中使用访问令牌。我正在使用Angular4作为客户端应用程序。登录后,我同时获得了访问令牌和刷新令牌。我有一个授权属性来检查我的 Get/Post 请求是否有效。 我在每个请求中发送带有访问令牌的刷新令牌。当我的访问令牌过期时,我的授权属性阻止我访问获取/发布功能。如何使用有效的刷新令牌授权我的 get/post 函数,并在验证 get/post 方法期间生成新的访问令牌。

共有1个答案

赖渊
2023-03-14

访问令牌和刷新令牌是两个不同的东西。

访问令牌用于访问资源。您可以在每次请求时向资源发送访问令牌。

刷新令牌用于获取新的访问令牌,而无需发送凭据。刷新令牌将发送到授权终结点。但仅在访问令牌过期(返回未经授权的响应)之后。

确保刷新令牌不会在访问令牌过期之前过期。因为否则你必须再次发送凭据。

还要注意,refesh令牌应该保密,因为它可以用来检索令牌,而不必发送凭证。总是通过安全线路发送。

-更新-

刷新令牌的服务器

我假设您有一个OAuthAuthorizationServerProvider来处理登录。类似于:

internal class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {

为了选择加入,您可以重写GrantRefreshToken以接受刷新令牌:

public override async Task GrantRefreshToken(OAuthGrantRefreshTokenContext context)
{
    // chance to change authentication ticket for refresh token requests
    var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
    var appUser = await userManager.FindByNameAsync(context.Ticket.Identity.Name);
    var oAuthIdentity = await appUser.GenerateUserIdentityAsync(userManager);
    var newTicket = new AuthenticationTicket(oAuthIdentity, context.Ticket.Properties);

    context.Validated(newTicket);
}

添加提供程序以将刷新令牌添加到票证:

internal class ApplicationOAuthRefreshTokenProvider : AuthenticationTokenProvider
{
    public override void Create(AuthenticationTokenCreateContext context)
    {
        var form = context.Request.ReadFormAsync().Result;
        var grantType = form.GetValues("grant_type");

        // If I remember correctly we arrive here for all implemented grant types.
        // But we don't want to add a refresh token to the refresh token itself.

        if (grantType[0] != "refresh_token")
        {
            // 35 days.
            int expire = 35 * 24 * 60 * 60;
            context.Ticket.Properties.ExpiresUtc = new DateTimeOffset(DateTime.Now.AddSeconds(expire));
            context.SetToken(context.SerializeTicket());
        }
        base.Create(context);
    }

    public override void Receive(AuthenticationTokenReceiveContext context)
    {
        context.DeserializeTicket(context.Token);
        base.Receive(context);
    }

}

别忘了在创业公司注册:

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        // Other statements ...

        // Configure the application for OAuth based flow
        var oAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider("self"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
#if LIVE
            AllowInsecureHttp = false,
#else
            AllowInsecureHttp = true,
#endif
            RefreshTokenProvider = new ApplicationOAuthRefreshTokenProvider()
        };
        app.UseOAuthBearerTokens(oAuthOptions);
    }
 类似资料:
  • 我在自己的Web API上使用Oauth2,在Web应用程序上使用ASP.NET C#来使用该API。在我的web应用程序上,我正在进行HttpWebRequests。当我的访问令牌过期时,我调用一个方法“refreshToken”,该方法发出请求以获取新的访问令牌。这工作很好,没有问题...除了我得到的响应包含一个新的刷新令牌???我在等新的访问令牌。我甚至认为在没有再次传递凭据的情况下这是不可

  • 我执行本问题中描述的步骤: Laravel的5.3护照和api路由 从api的路径来看,一切都很好,我可以注册新用户,读取他们的数据等等。 然后在AuthServiceProvider上添加此命令 护照::代币ExpireIn(碳::现在()- 我以url{{url}}/oauth/token登录邮递员 正文:application/x-www-form-urlencoded { 授权类型:{pa

  • 我正在尝试从应用程序服务中获取Google的刷新令牌,但我不能。 日志说 2016-11-04T00:04:25 PID[500]收到的详细请求:获取https://noteappsvr.azurewebsites.net/.auth/login/google?access _ type = offline 2016-11-04t 00:04:25 PID[500]从https://account

  • 我在我的Google-drive API中有刷新令牌和访问令牌。但是我不想每次用户使用我的API时都请求一个新的访问令牌,因为我存储了我的刷新令牌。如何从刷新令牌中获取新访问令牌

  • 我在谷歌日历API工作。 问题是当使用刷新令牌时,我得到的是“请求失败:未授权(401)”(刷新令牌是因为用户不应该每次都需要登录) 对于在用户首次授权应用程序后检索的正常访问令牌(未过期),它可以正常工作。 下面是运行时url,它只在不使用刷新的访问令牌之前工作。

  • 我正在使用Cognito用户池对系统中的用户进行身份验证。成功的身份验证将提供一个ID令牌(JWT)、一个访问令牌(JWT)和一个刷新令牌。这里的文档清楚地提到了刷新令牌可以用于刷新访问令牌,但没有提到如何使用。我的问题是,一旦我的访问令牌过期,我如何使用存储的刷新令牌再次刷新我的访问令牌? 我搜索了JavaScript SDK,但找不到任何方法来做同样的事情。我肯定错过了什么。 我还想通过Lam