Я использую шаблон 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);
}
}