Я использую WebAPI для ответа на запросы Android и углового интерфейса. для аутентификации я использовал библиотеку OWIN. Я установил срок действия токена на 1 день, а срок действия обновления токена - на 7 дней, но срок действия моих токенов истекает через 2 часа, и я получаю ответ invalid_grant при вызове функции обновления токена ...
Кто-нибудь знает, почемуэтот срок действия не работает?
Вот мой код:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var corsPolicy = new EnableCorsAttribute("*", "*", "*");
app.UseCors(new CorsOptions
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = request =>
request.Path.Value == "/token" ?
corsPolicy.GetCorsPolicyAsync(null, CancellationToken.None) :
Task.FromResult<CorsPolicy>(null)
}
});
OAuthAuthorizationServerOptions option = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AllowInsecureHttp = true,
RefreshTokenProvider = new ApplicationRefreshTokenProvider()
};
app.UseOAuthBearerTokens(option);
app.UseOAuthAuthorizationServer(option);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
if (context.ClientId == null)
context.Validated();
return Task.FromResult<object>(null);
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
UserCredential uc = Repository.UserRepository.FindByUserNameAndPassword(context.UserName, context.Password);
if (uc != null)
{
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("Username", uc.UserName));
identity.AddClaim(new Claim("Id", uc.User.Id.ToString()));
identity.AddClaim(new Claim("Phone", uc.User.Phone));
identity.AddClaim(new Claim("FirstName", uc.User.FirstName));
identity.AddClaim(new Claim("LastName", uc.User.LastName));
identity.AddClaim(new Claim("Address", uc.User.Address));
identity.AddClaim(new Claim("PostalCode", uc.User.PostalCode));
identity.AddClaim(new Claim("LoggedOn", DateTime.Now.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, uc.User.Role));
var additionalData = new AuthenticationProperties(new Dictionary<string, string>
{
{
"role", uc.User.Role
}
});
var token = new AuthenticationTicket(identity, additionalData);
context.Validated(token);
}
else
{
context.SetError("invalid_grant", "Username or password is not valid.");
context.Rejected();
}
}
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
{
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
return Task.FromResult<object>(null);
}
public override Task GrantRefreshToken(OAuthGrantRefreshTokenContext context)
{
var newIdentity = new ClaimsIdentity(context.Ticket.Identity);
var newTicket = new AuthenticationTicket(newIdentity, context.Ticket.Properties);
context.Validated(newTicket);
return Task.FromResult<object>(null);
}
}
public class ApplicationRefreshTokenProvider : IAuthenticationTokenProvider
{
private const int EXPIRE_DAYS = 7;
public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
Create(context);
}
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
Receive(context);
}
public void Create(AuthenticationTokenCreateContext context)
{
object inputs;
context.OwinContext.Environment.TryGetValue("Microsoft.Owin.Form#collection", out inputs);
var grantType = ((FormCollection)inputs)?.GetValues("grant_type");
var grant = grantType.FirstOrDefault();
if (grant == null || grant.Equals("refresh_token")) return;
context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(EXPIRE_DAYS);
context.SetToken(context.SerializeTicket());
}
public void Receive(AuthenticationTokenReceiveContext context)
{
context.DeserializeTicket(context.Token);
if (context.Ticket == null)
{
context.Response.StatusCode = 400;
context.Response.ContentType = "application/json";
context.Response.ReasonPhrase = "invalid token";
return;
}
if (context.Ticket.Properties.ExpiresUtc <= DateTime.UtcNow)
{
context.Response.StatusCode = 401;
context.Response.ContentType = "application/json";
context.Response.ReasonPhrase = "unauthorized";
return;
}
context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(EXPIRE_DAYS);
context.SetTicket(context.Ticket);
}
}
Что я делаю: Сначала я отправляю запрос токена и получаю токен и обновлениемаркер. Примерно через 2 часа, когда я отправляю запрос refresh_token, я получаю ответ invalid_grant, несмотря на то, что срок действия токена установлен на 1 день !!!