【问题标题】:Implementing a dynamic OAuthBearerServerOptions AccessTokenExpireTimeSpan value from data store从数据存储实现动态 OAuthBearerServerOptions AccessTokenExpireTimeSpan 值
【发布时间】:2015-04-12 16:14:48
【问题描述】:

这篇文章的上下文涉及到 ASP.NET Web API 2.2 + OWIN 该环境是具有 OWIN 服务器和 Web Api 的单个应用程序。

背景

在 Startup 类中,必须指定 OAuthBearerServerOptions,它提供给 OAuthBearerAuthenticationProvider。这些选项是在 OWIN 服务器启动期间创建的。在OAuthBearerServerOptions 上,我必须指定AccessTokenExpireTimeSpan,以便确保令牌到期。

问题

我必须能够根据每个身份验证请求动态指定到期时间跨度。我不确定这是否可以做到并且想知道:

  • 可以吗?
  • 如果是;我可以在什么时候执行此查找和到期分配?

启动配置内容:

    var config = new HttpConfiguration();

    WebApiConfig.Register(config);


    var container = builder.Build();
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    var OAuthServerOptions = new OAuthAuthorizationServerOptions()
    {
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/OAuth"),
        AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(**THIS NEEDS TO BE DYNAMIC**)),
        Provider = new AuthorizationServerProvider()
    };

    //STOP!!!!!!!!
    //DO NOT CHANGE THE ORDER OF THE BELOW app.Use statements!!!!!

    //Token Generation 
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); //this MUST come before oauth registration
    app.UseOAuthAuthorizationServer(OAuthServerOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
    {
        Provider = new BearerProvider()
    });
    app.UseAutofacMiddleware(container); //this MUST come before UseAutofacWebApi
    app.UseAutofacWebApi(config);//this MUST come before app.UseWebApi
    app.UseWebApi(config);

我开始弄乱 BearerProvider 类(请参阅上面的 app.UseOAuthBearerAuthentication 了解我在哪里使用此类),特别是 ValidateIdentity 方法,但不确定这是否是身份验证工作流中设置此值的正确点.这似乎是合适的,但我寻求验证我的立场。

public class BearerProvider : OAuthBearerAuthenticationProvider
{
    public override async Task RequestToken(OAuthRequestTokenContext context)
    {
        await base.RequestToken(context);

        //No token? attempt to retrieve from query string
        if (String.IsNullOrEmpty(context.Token))
        {
            context.Token = context.Request.Query.Get("access_token");

        }
    }
    public override Task ValidateIdentity(OAuthValidateIdentityContext context)
    {
        //context.Ticket.Properties.ExpiresUtc= //SOME DB CALL TO FIND OUT EXPIRE VALUE..IS THIS PROPER?
        return base.ValidateIdentity(context);
    }
}

提前致谢!

【问题讨论】:

    标签: asp.net-web-api oauth token owin


    【解决方案1】:

    设置 context.Options.AccessTokenExpireTimeSpan 实际上会改变全局值,并影响所有请求,这对原始要求不起作用。

    正确的地方是 TokenEndpoint 方法。

    public override Task TokenEndpoint(OAuthTokenEndpointContext context)
    {
        ...
    
        if (someCondition)
        {
            context.Properties.ExpiresUtc = GetExpirationDateFromDB();
        }
    
        ...
    }
    

    【讨论】:

    • 感谢您的信息。我目前不再参与该项目,但如果我得到验证,我会这样做并更新帖子,确认和可能的答案更改。
    • 我知道这个答案现在有点老了,但这对我不起作用。无论我在ExpiresUtc 中设置了什么,返回令牌中的“.expires”时间仍然是默认的 20 分钟。
    • @Tom,你确定吗?我只是重新测试,它仍然对我有用。你使用的是哪个版本的Microsoft.Owin,你能分享一些你如何使用它的代码吗?
    【解决方案2】:

    所以我完全走错了地方。我最终要做的是使用我的自定义 OAuthorizationServerProvider 并在该自定义类中重写的 GrantResourceOwnerCredentials 方法中,我能够通过访问...

    context.Options.AccessTokenExpireTimeSpan
    

    财产。

     <!-- language: c# -->
    
        public class AuthorizationServerProvider : OAuthAuthorizationServerProvider
            {
                public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
                {
                   //DO STUFF
                   var expireValue=GetTimeOutFromSomeplace();
                   context.Options.AccessTokenExpireTimeSpan = expireValue;
                   //DO OTHER TOKEN STUFF
                } 
            }
    

    【讨论】:

    • 这不是正确的答案。如果正在处理多个客户端请求,则您正在创建竞争条件。
    • 是因为AccessTokenExpireTimeSpan的更新吗?
    • 没错。假设客户 A 进来,您希望它设置为 1 小时。 GrantResourceOwnerCredentials 开始处理它,您将 context.Options.AccessTokenExpireTimeSpan 更改为 1 小时。现在客户 B 进来了,您希望它设置为 1 年。它将 context.Options.AccessTokenExpireTimeSpan 更改为 1 年。现在客户端 A 和 B 最终都退出了 GrantResourceOwnerCredentials 并且都在 1 年内到期。
    • 非常有意义。谢谢你。上面Dichen的回答是否更准确地回答了这个问题?它“看起来”像我所追求的,但我已经好几个月没有参与那个项​​目了(停滞不前),所以我还没有对其进行测试。
    • 我同意。文档很糟糕。
    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2013-01-24
    • 2013-02-03
    相关资源
    最近更新 更多