根据对这个问题的其他答案的反馈、额外的研究和线下讨论,我们最终做了以下事情......
很快就有人指出,这里的交互模型与选中“记住我”复选框时 ASP.NET 中的表单身份验证使用的模型基本完全相同。它不是发出 HTTP 请求的 Web 浏览器。我们的“票证”等同于 Forms Authentication 设置的 cookie。默认情况下,表单身份验证本质上使用“使用密钥加密某些数据”的方法。
在我们的登录 Web 服务中,我们使用此代码创建票证:
string[] userData = new string[4];
// fill the userData array with the information we need for subsequent requests
userData[0] = ...; // data we need
userData[1] = ...; // other data, etc
// create a Forms Auth ticket with the username and the user data.
FormsAuthenticationTicket formsTicket = new FormsAuthenticationTicket(
1,
username,
DateTime.Now,
DateTime.Now.AddMinutes(DefaultTimeout),
true,
string.Join(UserDataDelimiter, userData)
);
// encrypt the ticket
string encryptedTicket = FormsAuthentication.Encrypt(formsTicket);
然后,我们为 WCF 服务添加了一个操作行为属性,该属性添加了一个 IParameterInspector,用于检查请求的 HTTP 标头中的有效票证。开发者将这个操作行为属性放在需要认证的操作上。以下是该代码解析票证的方式:
// get the Forms Auth ticket object back from the encrypted Ticket
FormsAuthenticationTicket formsTicket = FormsAuthentication.Decrypt(encryptedTicket);
// split the user data back apart
string[] userData = formsTicket.UserData.Split(new string[] { UserDataDelimiter }, StringSplitOptions.None);
// verify that the username in the ticket matches the username that was sent with the request
if (formsTicket.Name == expectedUsername)
{
// ticket is valid
...
}