2

最初に何をしようとしているのかを説明します。たとえば、クレーム識別子が渡されてい0e.t|saml provider|first.last@domain.localます。にトリミングしたいfirst.last@domain.local

これは単純な文字列フォーマットで実行できることはよく知っていますが、これはあまり柔軟ではないため、予期しないものが渡されると、文字列フォーマットが失敗する可能性があります。問題が発生しやすくなります。

代わりにこれを動的に行いたいです。これが私が試したことです。

上記のクレーム識別子をEnsureUser使用して、SPUser.Name を呼び出します。

SPUser spUser = SPContext.Current.Web.EnsureUser(spUserName);
userName = spUser.Name;

のパラメーターとして次の文字列を試しましたがEnsureUser、すべて例外が発生します。The user with the specified logonName cannot be found in Active Directory.

0e.t|saml provider|first.last@domain.local

saml provider|first.last@domain.local

first.last@domain.local

繰り返しますが、それらはすべて失敗します。

(このブログSPClaimProviderManagerから引っ張ってきました)を使用して、私が試した別のアプローチ:

SPClaimProviderManager mgr = SPClaimProviderManager.Local;
if (mgr != null && SPClaimProviderManager.IsEncodedClaim(userName))
{
    spUserName = mgr.DecodeClaim(SPContext.Current.Web.CurrentUser.LoginName).Value;
}

他の何かではなく、実際のクレームをデコードしようとしていることを確認したいので、 を呼び出しますIsEncodedClaim。ただし、これは常に を返しますfalse

私の質問:

1) これらの試みの両方が失敗する結果となる、ここで間違っていることは何ですか? それらが適切に機能するためには、何を別の方法で行う必要がありますか?

2) 文字列を解析せずにフレンドリ クレーム ユーザー名を取得するためのより良い方法はありますか?

4

1 に答える 1

2

ため息どういうわけか、i:クレーム文字列の先頭にある が切り落とされていました。

読むべきだっi:0e.t|saml provider|first.last@domain.localた。それが追加されると、すべてが適切に機能し始めました。

于 2013-05-13T19:38:28.480 に答える