トークンの有効期限を動的に設定しようとしていますが、デフォルトでは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"
}
現在の有効期限を設定できない理由はありますか?このサーバーは、指定された有効期限が異なるさまざまなクライアントを使用するため、これがこれを行う場所であると考えました。私がこれをやるべき他の場所はありますか?ありがとう!
表示されている動作は、O_Auth2認可サーバーalwaysがGrantResourceOwnerCredentials
通知(もう一方のGrant*
通知も影響を受けます): https://github.com/jchannon/katanaproject/blob/master/src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerHandler.cs#L386
回避策は、AuthenticationTokenProvider.CreateAsync
(OAuthAuthorizationServerOptions.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
同様の状況があり、異なるクライアントが異なるトークンタイムアウトを持つため、それに応じて有効期限を設定できるようにしたいと考えました。実装した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);
}
*競合状態を解決するために編集。
私はここでこれを捨てます。今のところ、新しいクラスを作成せずに、オプションを設定するだけの簡単な方法があります。
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
...
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
..
};
TokenEndPoint
メソッドの代わりにGrantResourceOwnerCredentials
メソッドで設定できます。同様の質問に対する私の答えをご覧ください here 。
役に立てば幸いです。