0

技術: ASP.Net Web API 2 認証。

IDE : Visual Studio 2013 で SPA テンプレートを使用しています。

ストーリー: 1 つの Get メソッド (コードを参照) を持つコントローラーを追加し、「System.Threading.Thread.CurrentPrincipal.Identity.Name」を出力するためにテストを実行しました。最終的なゲームは、API を呼び出すクライアントの ID を見つけることです。

質問: ID が空で表示されるのはなぜですか? 呼び出しが別のスレッドで処理されるという事実に関連していますか? トークン (クライアントがログイン時に受け取ったもの) はリクエストの一部であり、認証に使用されていますか?

わかりやすくするために短くまとめてみましたので、さらに詳しい情報が必要な場合はお知らせください。

public class abcController : ApiController
{
    // GET api/abc
    public IEnumerable<string> Get()
    {
        return new string[] 
        { System.Threading.Thread.CurrentPrincipal.Identity.Name.ToString(), 
          "My Try" 
        };
    }

わかりました、回避策を見つけました(解決策ではありません)。基本的に、この行「config.SuppressDefaultHostAuthentication();」を削除します。 http://forums.asp.net/p/1944393/5594350.aspx?Re+Web+API+2+how+do+I+find+the+identity+of+an+authenticated+user+


4

2 に答える 2

0

Try getting the identity from the HttpRequestMessage object and not from the current thread:

    public IEnumerable<string> Get()
    {
        return new string[]  
        { 
            this.Request.GetRequestContext().Principal.Identity.Name
        };
    }

The static methods HttpContext are no longer available in Web Api 2.

于 2013-12-31T21:30:55.173 に答える
0

JavaScript 側では、webapi 呼び出しで、次のように app.datamodel.js で getSecurityHeaders 関数を呼び出していることを確認する必要があります (もちろん、ログインした後):

    var getabc = function () {
        return $.ajax("api/abc", {
            type: "GET",
            headers: getSecurityHeaders()
        });
    };

getSecurityHeaders() 関数を呼び出さない場合、Identity は null になります。

完全を期すために、その関数は次のとおりです。

function getSecurityHeaders() {
        var accessToken = sessionStorage["accessToken"] || localStorage["accessToken"];

        if (accessToken) {
            return { "Authorization": "Bearer " + accessToken };
        }

        return {};
    }
于 2014-01-05T02:10:04.423 に答える