在web api中令牌中的额外声明

时间:2018-06-07 06:01:15

标签: c# asp.net-web-api

Web api中Token的目的是确保用户的身份。这是我创建令牌的方式。

public AuthTokenModel GenerateToken(string UserName, string password, string appCode)
    {
        var tokenExpiration = TimeSpan.FromSeconds(Convert.ToDouble(GetAppSettingsValue("TokenExpiry")));

        ClaimsIdentity identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType);

        identity.AddClaim(new Claim("loginId", UserName));
        identity.AddClaim(new Claim("password", password));
        identity.AddClaim(new Claim("applicationCode", appCode));

        var props = new AuthenticationProperties()
        {
            IssuedUtc = DateTime.UtcNow,
            ExpiresUtc = DateTime.UtcNow.Add(tokenExpiration),
        };
        var ticket = new AuthenticationTicket(identity, props);
        var accessToken = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);

        AuthTokenModel model = new AuthTokenModel();
        model.AccessToken = string.Format("{0} {1}", "bearer", accessToken);
        model.TokenType = "bearer";
        model.ExpiresIn = tokenExpiration.TotalSeconds.ToString();
        model.Expires = ticket.Properties.ExpiresUtc.ToString();
        model.Issued = ticket.Properties.IssuedUtc.ToString();

        return model;
    }

,模型定义为:

public class AuthTokenModel
{
    public string AccessToken { get; set; }

    public string TokenType { get; set; }

    public string ExpiresIn { get; set; }

    public string Issued { get; set; }

    public string Expires { get; set; }
}

但我想知道我是否在Token中添加更多用户的详细信息是更好的方法?如果我从令牌而不是数据库中获得更多细节,那么性能如何。

1 个答案:

答案 0 :(得分:0)

  1. 切勿在任何地方包含用户密码。特别是在令牌中。
  2. Token本身就是一个非常抽象的东西。持票人令牌的概念 声明只有一个想法:拥有此令牌的任何人都可以 以与其他人相同的方式使用它。此令牌是一种用户的 权威确认。
  3. 实施基于令牌的专有身份验证协议 不是最好的选择,因为这是一项复杂的工作。
  4. 查看OAuth2.0 / OpenIDConnect协议文档。考虑成熟和opensource .net-core (以及以前经典的.net框架)的解决方案,实现了这些协议 - IdentityServer
  5. 我认为这将是理解网络应用程序中基于令牌的身份验证的良好开端。