我想在我的MVC 5项目中自定义我的登录方案。 我按照SPA模板使用oauth bearer token进行身份验证。但我想添加一些逻辑来控制AccessTokenExpires时间。
根据这个topic和A de Baugh的评论,我可以更改故障单属性的过期时间。但我仍然找不到将我的逻辑添加到自定义OAuthAuthorizationServerProvider类的位置。 基本上我想通过在发送登录请求时传递更多参数来添加类似记住我的内容。目前我必须创建另一个控制器来处理登录
控制器的登录方法如下
// POST api/Account/Login
[AllowAnonymous]
[Route("Login")]
public async Task<IHttpActionResult> Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
ApplicationUser user = await userManager.FindAsync(model.UserName, model.Password);
if (user != null)
{
ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
OAuthDefaults.AuthenticationType);
ClaimsIdentity cookieIdentity = await userManager.CreateIdentityAsync(user,
CookieAuthenticationDefaults.AuthenticationType);
AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName);
// my check for remember me
if (model.RememberMe)
properties.ExpiresUtc = properties.IssuedUtc + TimeSpan.FromDays(7);
else properties.ExpiresUtc = properties.IssuedUtc + TimeSpan.FromHours(3);
var ticket = new AuthenticationTicket(oAuthIdentity, properties);
Authentication.SignIn(properties, oAuthIdentity, cookieIdentity);
return Ok(new
{
user = model.UserName,
access_token = accessTokenFormat.Protect(ticket),
expire = properties.ExpiresUtc
});
}
ModelState.AddModelError("error", "Invalid username or password");
}
return BadRequest(ModelState);
}
认证
private IAuthenticationManager Authentication
{
get { return Request.GetOwinContext().Authentication; }
}
并且用于保护票证的accessTokenFormat是Startup.OAuthOptions.AccessTokenFormat
我是以不寻常的方式做到这一点的吗?我相信有一个更好的方法来归档这个。任何建议都会受到赞赏。谢谢!
我并不完全理解你的问题,但通过滚动我的一个OAuthAuthenicationServerProvider,我在github上找到了一个来自@leastprivilege的非常好的例子:SimpleRefreshTokenProvider ...这描述了(带注释)如何处理令牌的刷新周期。也许这是抽象你自己的例子的一个很好的起点。
HTH
P.S。:花一些时间阅读他关于安全性OAuth的博客也是值得的,... http://leastprivilege.com/