在ASP.NET MVC中刷新/重新生成用于移动应用Web API的令牌

问题描述

我正在使用面向移动应用的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分钟的到期时间后返回访问令牌。

这里的问题是:

这是保持会话活动而不使用刷新令牌流的有效方法吗?有什么安全隐患吗?

GrantCustomExtension方法代码

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 (将#修改为@)