我会先解释一下我要做的事情。我传入了声明标识符,例如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
(从this blog拉出来):
SPClaimProviderManager mgr = SPClaimProviderManager.Local;
if (mgr != null && SPClaimProviderManager.IsEncodedClaim(userName))
{
spUserName = mgr.DecodeClaim(SPContext.Current.Web.CurrentUser.LoginName).Value;
}
我想确保我尝试解码实际声明,而不是其他内容,因此我致电IsEncodedClaim
。但是,这始终返回false
。
我的问题:
1)我在这里做错了什么导致这两种尝试都失败了?我需要做些什么才能让他们正常运作?
2)有没有更好的方法来获得没有字符串解析的友好声明用户名?
答案 0 :(得分:2)
叹息不知何故声明字符串开头的i:
被删掉了。
应该阅读i:0e.t|saml provider|first.last@domain.local
。一旦添加回来,一切都开始正常运作。