我可以访问自定义服务器端点,该端点能够使用存储在该服务器上的客户端密钥来代理 OAuth-2.0 流。授权令牌已被交换,现在我持有不记名访问令牌。冲动是将这个令牌存储在
SecureStorage
中,并且(例如)像这样使用它:
private static async Task<Oidc?> userInfoCall()
{
var accessToken =
JsonConvert.DeserializeObject<TokenResponse>(
await SecureStorage.GetAsync(nameof(SecureKeys.ApiToken)))
.AccessToken;
string userinfoRequestURI =
"https://www.googleapis.com/oauth2/v3/userinfo";
HttpWebRequest userinfoRequest =
(HttpWebRequest)WebRequest.Create(userinfoRequestURI);
userinfoRequest.Method =
"GET";
userinfoRequest.Headers.Add(
$"Authorization: Bearer {accessToken}");
userinfoRequest.ContentType =
"application/x-www-form-urlencoded";
userinfoRequest.Accept =
"Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
WebResponse userinfoResponse =
await userinfoRequest.GetResponseAsync();
using (
StreamReader userinfoResponseReader =
new StreamReader(userinfoResponse.GetResponseStream()))
{
string userinfoResponseText = userinfoResponseReader.ReadToEnd();
var rsp = JsonConvert.DeserializeObject<Oidc>(userinfoResponseText);
return rsp;
}
}
我知道
SecureStorage
是加密的,但是什么阻止任何人附加到这个过程或追踪到这个方法并看到它像白天一样?代码混淆可能会让此时发生的事情变得不太明显,但事实并非如此。
我觉得我好像错过了一些重要的东西。最佳实践是什么?如何以不增加攻击面的方式消耗代币?
正如雷蒙德·陈 (Raymond Chen) 在类似案例中打趣的那样,这相当于站在密闭舱口的另一侧。能够跟踪您的进程并从中转储字符串的人很可能会做比窃取短暂的(它们是短暂的,对吧?)不记名令牌更有趣的事情。事实上,将不记名令牌存储在任何地方都会增加攻击面,因为攻击面现在除了进程及其运行的系统之外还包括您用来存储令牌的任何系统。只需将令牌保留在内存中并在重新启动等后重新请求新的令牌即可。