ThinkTecture身份模型基于令牌获取用户

时间:2013-04-12 15:48:18

标签: c# asp.net-web-api token thinktecture-ident-model

我正在使用Thinktecture的Sweet Indentity Model库。我看起来高低不一,可能会问一个愚蠢的问题。基本上,我们有一个Web窗体应用程序,我正在为它添加ASP.net Web api功能。我安装了身份代码示例,并高兴地认为我需要让它为会话令牌工作我能够获得一个令牌并在未来的呼叫中发回,但在我的API控制器中似乎没有设置用户对象。我假设框架将询问令牌(如果提供)并根据令牌数据自动设置Principal并将Principal标记为已验证?这是一个无效的假设,这是我必须自己设定的吗?

基本上我使用令牌进行授权和身份验证,但需要从令牌/会话中提取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 HELPER方法:

 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);

0 个答案:

没有答案