我正在使用 Thinktecture 的甜蜜 Indentity Model 库。我看起来高高在低,可能要问一个愚蠢的问题。基本上,我们有一个 Web 窗体应用程序,我正在向它添加 ASP.net Web api 功能。我安装了身份代码示例并收集了我认为我需要让它为会话令牌工作我能够获得一个令牌并在未来的调用中发回但在我的 API 控制器中似乎没有设置用户对象。我假设框架会在提供令牌时询问令牌并根据令牌数据自动设置委托人并将委托人标记为已验证?这是一个无效的假设吗?这是我必须自己设定的吗?
基本上,我使用令牌进行授权和身份验证,但需要从令牌/会话中提取 UserID 以获取其他业务规则。
再次,如果愚蠢的问题可以随意欺骗我。如果这对任何建议有任何影响,我正在使用单元测试进行测试。
来自单元测试的代码:1)获取令牌,使用我们的业务逻辑成功验证用户并成功返回令牌:
private string GetToken(string username, string password)
{
Uri _baseAddress = new Uri(Thinktecture.Samples.Constants.WebHostBaseAddress);
var client = new HttpClient { BaseAddress = _baseAddress };
client.SetBasicAuthentication(username, password);
var response = client.GetAsync("token").Result;
response.EnsureSuccessStatusCode();
var tokenResponse = response.Content.ReadAsStringAsync().Result;
var json = JObject.Parse(tokenResponse);
var token = json["access_token"].ToString();
var expiresIn = int.Parse(json["expires_in"].ToString());
var expiration = DateTime.UtcNow.AddSeconds(expiresIn);
return token;
}
2)HTTP帮助方法:
private async Task<HttpResponseMessage> Post<T>(string path, T data, string Token)
{
//var handler = new HttpClientHandler {};
//using (var client = new HttpClient(handler))
using (var client = new HttpClient())
{
if (!String.IsNullOrEmpty(Token))
{
client.SetToken("Session", Token);
//client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Session", Token);
}
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.BaseAddress = new Uri("http://localhost/");
var response = await client.PostAsJsonAsync(path, data);
response.EnsureSuccessStatusCode(); // Throw on error code.
return response;
}
}
3) 调用代码:
string Token = GetToken("UserName", "Password");
removed proprietry code here....
Task<HttpResponseMessage> result = Post<GetCustomerDetailsRequest>("api/Account/GetCustomerProfile", GetCustomerDetailsRequest, Token);