1

ここで説明されているように、Windows 8 ストア アプリに ACS トークンを取得させる手順に従っています

Windows 8 クライアントの認証方法

private async void Authenticate()
    {
        WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
            WebAuthenticationOptions.None,
            new Uri("https://myACSnamespace.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http://localhost:12714/"),
            new Uri("http://mypublicIPaddress:80/WebAppMVCAPI/api/federation/end"));

Web アプリケーションのコントローラーは次のようにプログラムされています。

public class FederationController : ApiController
{
    protected virtual string ExtractBootstrapToken()
    {
        return HttpContext.Current.User.BootstrapToken();
    }

    [HttpGet]
    public string Get()
    {
        return "Hello Get World";
    }

    [HttpPost]
    public HttpResponseMessage Post()
    {
        var response = this.Request.CreateResponse(HttpStatusCode.Redirect);
        response.Headers.Add("Location", "/WebAppMVCAPI/api/federation/end?acsToken=" + ExtractBootstrapToken());
        return response;
    }
}

}

アイデアは、Windows 8 ストア アプリが Facebook ログインで ACS からトークンを取得することです。win8 クライアントを起動すると、アプリケーションに Facebook のログイン ページが表示されます。ただし、命令return HttpContext.Current.User.Bootstraptoken()は次の例外で失敗します。

NullReferenceException. Object reference not set to an instance of an object.

私の web.config は次のようになります。

  <microsoft.identityModel>
<service saveBootstrapTokens="true">
  <audienceUris>
    <add value="http://localhost:80" />
  </audienceUris>
  <federatedAuthentication>
    <wsFederation passiveRedirectEnabled="true" issuer="https://bondsapp.accesscontrol.windows.net/v2/wsfederation" realm="http://localhost:80/" reply="http://localhost:80/" requireHttps="false" />
    <cookieHandler requireSsl="false" path="/" />
  </federatedAuthentication>
  <issuerNameRegistry type="Microsoft.IdentityModel.Swt.SwtIssuerNameRegistry, Wif.Swt">
    <trustedIssuers>
      <add name="https://bondsapp.accesscontrol.windows.net/" thumbprint="xxxxx" />
    </trustedIssuers>
  </issuerNameRegistry>
  <securityTokenHandlers>
    <add type="Microsoft.IdentityModel.Swt.SwtSecurityTokenHandler, Wif.Swt" />
  </securityTokenHandlers>
  <issuerTokenResolver type="Microsoft.IdentityModel.Swt.SwtIssuerTokenResolver, Wif.Swt" />
</service>

誰かが Bootstraptoken メソッドを使用して ACS トークンを取得する方法を明らかにできますか?

ありがとうルイス

4

2 に答える 2

0

これを試しましたか:

BootstrapContext bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as BootstrapContext;                                  
SecurityToken st = bootstrapContext.SecurityToken;

Vittorio の投稿をご覧ください: http://blogs.msdn.com/b/vbertocci/archive/2012/11/30/using-the-bootstrapcontext-property-in-net-4-5.aspx

于 2013-01-05T13:19:11.147 に答える
0

フェデレーション認証がデフォルトで HttpContext.User を設定するとは思いません。試す

(Thread.CurrentPrincipal as IClaimsPrincipal).Identities[0].BootstrapToken

サイトでトークン ハンドラー パイプライン (WS-FAM) を通過したと仮定すると、これは設定されているはずです。これは SecurityToken オブジェクトになり、適切な SecurityTokenHandler クラスを使用してシリアル化できます。

于 2013-01-02T22:10:25.710 に答える