最初に何をしようとしているのかを説明します。たとえば、クレーム識別子が渡されてい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) 文字列を解析せずにフレンドリ クレーム ユーザー名を取得するためのより良い方法はありますか?