web-dev-qa-db-ja.com

OAuth2 Web APIトークンの有効期限

トークンの有効期限を動的に設定しようとしていますが、デフォルトでは20分のままです。

ここに私のConfigureAuthがあります:

public void ConfigureAuth(IAppBuilder app)
{

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(""),
            // In production mode set AllowInsecureHttp = false
            AllowInsecureHttp = true
        };

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);

}

GrantResourceOwnerCredentialsメソッドは次のとおりです。

    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {

        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        var hasValidLogin = (new login().authenticate(context.UserName, context.Password, "") == "valid");

        if (hasValidLogin == false)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return Task.FromResult<object>(null);
        }

        var oAuthIdentity = CreateIdentity(context);
        var oAuthProperties = CreateProperties(context);

        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, oAuthProperties);

        context.Validated(ticket);
        return Task.FromResult<object>(null);
    }

そして、有効期限を設定できるSetPropertiesメソッドを次に示します。

    public static AuthenticationProperties CreateProperties(OAuthGrantResourceOwnerCredentialsContext context)
    {

        IDictionary<string, string> data = new Dictionary<string, string>
        {
            { "client_id", context.ClientId }
        };

        var response = new AuthenticationProperties(data);
        response.ExpiresUtc = DateTime.Now.AddMonths(1);

        return response;
    }

その後も、トークンが返されます:

{
  "access_token": ".....",
  "token_type": "bearer",
  "expires_in": 1199,
  "client_id": ".....",
  ".expires": "Fri, 13 Nov 2015 20:24:06 GMT",
  ".issued": "Fri, 13 Nov 2015 20:04:06 GMT"
}

現在の有効期限を設定できない理由はありますか?このサーバーは、指定された有効期限が異なるさまざまなクライアントを使用するため、これがこれを行う場所であると考えました。私がこれをやるべき他の場所はありますか?ありがとう!

14
user3726393

表示されている動作は、O_Auth2認可サーバーalwaysGrantResourceOwnerCredentials通知(もう一方のGrant*通知も影響を受けます): https://github.com/jchannon/katanaproject/blob/master/src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerHandler.cs#L386

回避策は、AuthenticationTokenProvider.CreateAsyncOAuthAuthorizationServerOptions.AccessTokenProviderに使用するクラス)に有効期限を設定することです。

context.Ticket.Properties.ExpiresUtcに選択した有効期限を設定するだけで、意図したとおりに機能するはずです。

public class AccessTokenProvider : AuthenticationTokenProvider
{
    public override void Create(AuthenticationTokenCreateContext context)
    {
        context.Ticket.Properties.ExpiresUtc = // set the appropriate expiration date.

        context.SetToken(context.SerializeTicket());
    }
}

また、GrantResourceOwnerCredentialsからの有効期限の設定をネイティブでサポートする、OWIN/Katanaが提供するOAuth2承認サーバーのフォークAspNet.Security.OpenIdConnect.Serverを確認することもできます。 https://github.com/aspnet-contrib/AspNet.Security .OpenIdConnect.Server/tree/dev

11
Pinpoint

同様の状況があり、異なるクライアントが異なるトークンタイムアウトを持つため、それに応じて有効期限を設定できるようにしたいと考えました。実装したAuthenticationTokenProviderでは、有効期限を設定していましたが、トークンが署名されるまでに上書きされていました。

最終的に満足した解決策は、TokenEndpointメソッドをオーバーライドすることでした。その後、クライアント固有の有効期限を実装できます。

    public override Task TokenEndpoint(OAuthTokenEndpointContext context)
    {
        if (context.TokenIssued)
        {
            // client information
            var accessExpiration = DateTimeOffset.Now.AddSeconds(accessTokenTimeoutSeconds);
            context.Properties.ExpiresUtc = accessExpiration;
        }

        return Task.FromResult<object>(null);
    }

*競合状態を解決するために編集。

13
Michael

私はここでこれを捨てます。今のところ、新しいクラスを作成せずに、オプションを設定するだけの簡単な方法があります。

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
    ...
    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
    ..
};
2

TokenEndPointメソッドの代わりにGrantResourceOwnerCredentialsメソッドで設定できます。同様の質問に対する私の答えをご覧ください here

役に立てば幸いです。

2
jumuro