refre sh токен истекает после истечения срока действия токена доступа в промежуточном программном обеспечении owin в mvc - PullRequest
0 голосов
/ 06 мая 2020

Я использую шаблон Web Api 2, который поставляется с Visual Studio 2015, имеет некоторое промежуточное ПО OWIN для проверки подлинности пользователя

Я сгенерировал токен доступа и обновил токен sh, и я установил срок действия токена доступа 1 минута. мой код работает очень хорошо в моей локальной системе. но когда на хосте на сервере возникает проблема: get

1) при запуске refre sh токена через 1 минуту он дает

{"error ":" invalid_grant "} но до 1 минуты все работает нормально

2) предположим, если мы установим время токена доступа 10 минут. и мы не нажимаем api до 8 минут, а при нажатии api через 8 минут он работает, и снова время токена доступа должно быть установлено 10 минут, но net Hit через 2 минуты истечет. это не работает локально, а на сервере.

но проблема 1) работает на локальном компьютере, а не работает на сервере.

любой, пожалуйста, помогите мне. Я дал свой код.

public void Configuration(IAppBuilder app)
        {
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            OAuthAuthorizationServerOptions options = new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,

                TokenEndpointPath = new PathString("/api/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(1), //TimeSpan.FromMinutes(1),

                Provider = new MyAuthorizationServerProvider(),
                RefreshTokenProvider = new RefreshTokenProvider()
            };

            app.UseOAuthAuthorizationServer(options);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

            HttpConfiguration config = new HttpConfiguration();
            WebApiConfig.Register(config);
        }

это RefreshToken предоставить класс

public class RefreshTokenProvider : IAuthenticationTokenProvider
    {
        private static ConcurrentDictionary<string, AuthenticationTicket> _refreshTokens = new ConcurrentDictionary<string, AuthenticationTicket>();
        public async  Task CreateAsync(AuthenticationTokenCreateContext context)
        {
            var guid = Guid.NewGuid().ToString();

            // copy all properties and set the desired lifetime of refresh token  
            var refreshTokenProperties = new AuthenticationProperties(context.Ticket.Properties.Dictionary)
            {
                IssuedUtc = context.Ticket.Properties.IssuedUtc,
                ExpiresUtc = DateTime.UtcNow.AddDays(1)//DateTime.UtcNow.AddYears(1)  
            };
            var refreshTokenTicket = new AuthenticationTicket(context.Ticket.Identity, refreshTokenProperties);

            _refreshTokens.TryAdd(guid, refreshTokenTicket);

            // consider storing only the hash of the handle  
            context.SetToken(guid);
        }

        public void Create(AuthenticationTokenCreateContext context)
        {
            throw new NotImplementedException();
        }

        public void Receive(AuthenticationTokenReceiveContext context)
        {
            throw new NotImplementedException();
        }

        public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
        {
            AuthenticationTicket ticket;
            string header = context.OwinContext.Request.Headers["Authorization"];

            if (_refreshTokens.TryRemove(context.Token, out ticket))
            {
                context.SetTicket(ticket);
            }
        }

    }

это сервер аутентификации предоставить класс

 public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {

            using (UserMasterRepository _repo = new UserMasterRepository())
            {
                var form = await context.Request.ReadFormAsync();

                var ActionType = form["ActionType"];
                string UID = context.UserName;
                string PWD = context.Password;

                if (ActionType.ToLower() == "student")
                {
                    var user = (USP_StudentLogin_Result)_repo.ValidateUser(UID, PWD, ActionType);                   
                    if (user == null)
                    {
                        context.SetError("invalid_grant", "Provided username and password is incorrect");
                        //context.SetError("Status", "false");
                        //context.Rejected();
                        return;
                    }
                    Dictionary<string, string> ObjInDictionary = user.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).ToDictionary(i => i.Name, i => i.GetValue(user, null).ToString());
                    var props = new AuthenticationProperties(ObjInDictionary);

                    var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                    identity.AddClaim(new Claim(ClaimTypes.Name, user.Name));
                    identity.AddClaim(new Claim("Email", user.Email));
                    identity.AddClaim(new Claim("Mobile", user.Mobile));
                    identity.AddClaim(new Claim("L_ID", user.L_ID.ToString()));

                    var ticket = new AuthenticationTicket(identity, props);
                    context.Validated(ticket);
                }
                else if (ActionType.ToLower() == "parent")
                {
                    var user = (USP_ParentLogin_Result)_repo.ValidateUser(UID, PWD, ActionType);
                    Dictionary<string, string> ObjInDictionary = user.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).ToDictionary(i => i.Name, i => i.GetValue(user, null).ToString());
                    var props = new AuthenticationProperties(ObjInDictionary);
                    if (user == null)
                    {
                        context.SetError("invalid_grant", "Provided username and password is incorrect");
                       // context.Rejected();
                        return;
                    }
                    var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                    identity.AddClaim(new Claim(ClaimTypes.Name, user.Name));
                    identity.AddClaim(new Claim("Email", user.Email));
                    identity.AddClaim(new Claim("Mobile", user.Mobile));
                    identity.AddClaim(new Claim("L_ID", user.L_ID.ToString()));

                    var ticket = new AuthenticationTicket(identity, props);
                    context.Validated(ticket);
                }
                else
                {
                    var user = (USP_SchoolLogin_Result)_repo.ValidateUser(UID, PWD, ActionType);
                    Dictionary<string, string> ObjInDictionary = user.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).ToDictionary(i => i.Name, i => i.GetValue(user, null).ToString());
                    var props = new AuthenticationProperties(ObjInDictionary);
                    if (user == null)
                    {
                        context.SetError("invalid_grant", "Provided username and password is incorrect");
                       // context.Rejected();
                        return;
                    }
                    var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                    identity.AddClaim(new Claim(ClaimTypes.Name, user.Name));
                    identity.AddClaim(new Claim("Email", user.Email));
                    identity.AddClaim(new Claim("Mobile", user.Mobile));
                    identity.AddClaim(new Claim("L_ID", user.L_ID.ToString()));

                    var ticket = new AuthenticationTicket(identity, props);
                    context.Validated(ticket);
                }
            }
        }
        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            if (context.ClientId == null)
                context.Validated();

            return Task.FromResult<object>(null);
        }
        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)
        {
            // Change authentication ticket for refresh token requests  
            var newIdentity = new ClaimsIdentity(context.Ticket.Identity);
            // newIdentity.AddClaim(new Claim("newClaim", "newValue"));

            var newTicket = new AuthenticationTicket(newIdentity, context.Ticket.Properties);
            context.Validated(newTicket);

            return Task.FromResult<object>(null);
        }     
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...