问题描述
我正在使用面向移动应用的asp.net Web api 2开发Web api。对于身份验证,在this和@L_502_1@之后,我正在使用OWIN中间件基于令牌的身份验证。我创建了一个示例应用程序,能够生成Bearer令牌并将其用于调用API端点。但是由于我们的移动应用程序需要长期的会话(用户可以保持登录状态2周),因此决定实施刷新令牌以生成短期的访问令牌。但是考虑到它的复杂性并需要额外的表来存储刷新令牌,我决定使用GrantCustomExtension方法以以下方式实现它。我的身份验证流程如下:
- 用户将首次在移动应用中输入用户名/密码
- 应用程序将调用api /令牌端点(grant_type =密码),该端点将根据db对用户进行身份验证,并返回承载令牌+用户密钥(为其分配给每个用户的唯一密钥)
- 令牌将在30分钟后失效
- 移动应用程序会将用户密钥存储在本地存储中,并且令牌过期后30分钟后,应用程序将调用api /令牌端点,但标头中具有grant_type = refreshtkn(自定义授予类型)和用户密钥。
- 应用程序将检查标头中的userkey并针对db进行验证,如果其有效,则会在30分钟的到期时间后返回访问令牌。
这里的问题是:
这是保持会话活动而不使用刷新令牌流的有效方法吗?有什么安全隐患吗?
public override async Task GrantCustomExtension(OAuthGrantCustomExtensionContext context) {
string authHeader = context.Request.Headers["Authorization"];
if (string.IsNullOrEmpty(authHeader) || context.GrantType != "refreshtkn") {
context.SetError("invalid_request","User details Could not be retrieved.");
context.Rejected();
return;
}
var header = AuthenticationHeaderValue.Parse(context.Request.Headers["Authorization"]);
var userKey = header.Parameter;
if (string.IsNullOrEmpty(userKey)) {
context.SetError("invalid_request","User details Could not be retrieved.");
context.Rejected();
return;
}
//Check the existence of by calling the Validate method
AppUser user = ValidateUserKey(userKey);
if (user != null) {
// user has been verified.
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Role,user.UserRoles));
identity.AddClaim(new Claim(ClaimTypes.Name,user.UserName));
identity.AddClaim(new Claim("Email",user.UserEmail));
context.Validated(identity);
} else {
// user Could not be validated.
context.SetError("invalid_user","User credentials are invalid.");
context.Rejected();
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)