Срок действия маркера Microsoft Owin и токена обновления скоро истекает - PullRequest
0 голосов
/ 24 октября 2019

Я использую 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 день !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...