7

MVC 4 Web Api を使用しており、サービスを使用する前にユーザーを認証する必要があります。

正常に動作する認証メッセージ ハンドラーを実装しました。

public class AuthorizationHandler : DelegatingHandler
{
    private readonly AuthenticationService _authenticationService = new AuthenticationService();

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        IEnumerable<string> apiKeyHeaderValues = null;
        if (request.Headers.TryGetValues("X-ApiKey", out apiKeyHeaderValues))
        {
            var apiKeyHeaderValue = apiKeyHeaderValues.First();

            // ... your authentication logic here ...
            var user = _authenticationService.GetUserByKey(new Guid(apiKeyHeaderValue));

            if (user != null)
            {

                var userId = user.Id;

                var userIdClaim = new Claim(ClaimTypes.SerialNumber, userId.ToString());
                var identity = new ClaimsIdentity(new[] { userIdClaim }, "ApiKey");
                var principal = new ClaimsPrincipal(identity);

                Thread.CurrentPrincipal = principal;
            }
        }

        return base.SendAsync(request, cancellationToken);
    }
}

問題は、フォーム認証を使用していることです。

[HttpPost]
    public ActionResult Login(UserModel model)
    {
        if (ModelState.IsValid)
        {
            var user = _authenticationService.Login(model);
            if (user != null)
            {
                // Add the api key to the HttpResponse???
            }
            return View(model);
        }

        return View(model);
    }

APIを呼び出すと:

 [Authorize]
public class TestController : ApiController
{
    public string GetLists()
    {
        return "Weee";
    }
}

ハンドラーが X-ApiKey ヘッダーを見つけることができません。

ユーザーがログインしている限り、ユーザーの api キーを http 応答ヘッダーに追加し、そこにキーを保持する方法はありますか? この機能を実装する別の方法はありますか?

4

2 に答える 2

1

コード サンプルから、Web フォームを使用しているようには見えません。フォーム認証を使用している可能性がありますか? サービス内でメンバーシップ プロバイダーを使用してユーザー資格情報を検証していますか?

API を呼び出してヘッダーを設定するコードから、HttpClient クラスとそのプロパティ DefaultRequestHeaders または HttpRequestMessage を使用できます。

ここに HttpClient の例をいくつか示します: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

于 2013-04-26T03:12:53.000 に答える