我正在向SecKeyChain添加身份,然后我尝试使用SecKeyChain.QueryAsConcreteType将其恢复。但是对于任何SecRecord查询,我都会获得SecStatusCode.Param。看起来问题是,当我使用新的SecRecord(SecKind.Identity)时,它不会将kSecClass放入可以添加但是查询失败的字典。
public SecRecord(SecKind secKind) {
IntPtr num = SecClass.FromSecKind(secKind);
if (num == SecClass.Identity) this._queryDict = new NSMutableDictionary();
else this.queryDict = NSMutableDictionary.LowlevelFromObjectAndKey(num, SecClass.SecClassKey);
}
如果我错了,请解释我如何向SecKeyChain添加身份然后检索它。 谢谢!
答案 0 :(得分:0)
注意:从bug report复制粘贴,从这里谷歌会更容易
与其他类不同,API对SecIdentity
不对称。此外,在这种情况下,返回值(SecStatusCode
)不值得信任。
当前的最佳(不使用太多IntPtr
或反射)方式来检索SecIdentity
,请执行以下操作:
using (SecRecord rec = new SecRecord (SecKind.Identity)) {
// the next line is the workaround
(rec.ToDictionary () as NSMutableDictionary) ["class"] = new NSString ("idnt");
SecStatusCode code;
var match = SecKeyChain.QueryAsConcreteType (rec, out code);
Assert.That (code, Is.EqualTo (SecStatusCode.Success), "QueryAsRecord-2");
Assert.NotNull (match, "match-2");
}
这将在执行查询之前回退class
并返回标识。
XI的未来版本将确保更简单的
using (SecRecord rec = new SecRecord (SecKind.Identity)) {
...
}
可用于向密钥链添加和查询SecIdentity。