最近在做公司的公众号,由于需要可以同时使用微信和用户名密码登陆,所以建立了如下payload类:
public class Payload
{
private string openId;
private string username;
private bool useOpenId;
public bool UseOpenId
{
get
{
return useOpenId;
}
}
public string OpenId
{
get
{
return openId;
}
set
{
openId = value;
useOpenId = true;
}
}
public string Username
{
get
{
return username;
}
set
{
username = value;
useOpenId = false;
}
}
}
在使用openid的时候如下实例Payload对象:
var payload = new Payload()
{
OpenId = "xxx";
}
之后得到token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VPcGVuSWQiOnRydWUsIk9wZW5JZCI6Im9wZW5JZCIsIlVzZXJuYW1lIjpudWxsfQ.iSEDAX45Y_EVLIujEU9QZX3VMKF7uOU_hYlbk_rlXS0
解析发现payload没有问题
但是在使用
Jwt
类库反序列化为对象的时候 UseOpenId
永远为 false
。
经过研究代码发现,在反序列化的时候会对属性依次赋值,因为顺序问题/名称问题,
Username
属性总会在OpenId
属性后赋值,即使该值为null
,所以出现上述问题。
Payload类修改如下,问题得以解决:
public string OpenId
{
get
{
return openId;
}
set
{
openId = value;
if(!string.IsNullOrEmpty(value))
useOpenId = true;
}
}
public string Username
{
get
{
return username;
}
set
{
username = value;
if(!string.IsNullOrEmpty(value))
useOpenId = false;
}
}
网友评论
public bool UseOpenId
{
get
{
return !string.IsNullOrEmpty(this.OpenId);
}
}
这样其它属性内可以不操作UseOpenId。