0

Thinktecture の甘い Indentity Model ライブラリを使用しています。私は高くも低くも見えましたが、おそらくばかげた質問をしようとしています。基本的に、ASP.net Web API 機能を追加する Web フォーム アプリケーションがあります。Identity コード サンプルをインストールし、セッション トークンで動作させるために必要だと思われるものを集めました。トークンを取得して、今後の呼び出しで送り返すことはできますが、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);
4

0 に答える 0