我需要实现一个从AD中检索某些字段的类。我已按照此处的说明进行操作:link。但是我从行中得到了一个未处理的例外:
return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityValue)
我的控制器代码如下所示:
using System.Threading.Tasks;
using System.Net;
using System.Data.Entity;
using System.DirectoryServices.AccountManagement;
(...)
public class HomeController : Controller
{
private FormsEntities db = new FormsEntities();
public async Task<ActionResult> Index()
{
UserPrincipalExtended user = UserPrincipalExtended.FindByIdentity(
new PrincipalContext(ContextType.Domain), User.Identity.Name);
var title = user.Title;
ViewBag.Message = title;
return View();
}
我应该添加任何其他配置吗?以web.config
为例?我想提一下,我使用AD登录名和密码以及代码成功实现了Windows身份验证。
string userName = HttpContext.User.Identity.Name.Split('\\')[1].ToString();
显示正确的用户。此外,我还试图操纵对象类型[DirectoryObjectClass("user")]
,但没有任何结果。
答案 0 :(得分:0)
首先,我建议您将PrincipalContext
放入using() { ... }?
区块,以确保妥善处置。
另外:每当你调用一个方法,例如Active Directory(或数据库,或称为Web服务) - 然后您需要确保您实际上获得了有效的东西!不要盲目地假设呼叫成功 - 也许它确实 - 也许它没有 - 检查成功!
所以我会写这样的索引方法:
public async Task<ActionResult> Index()
{
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
UserPrincipalExtended user = UserPrincipalExtended.FindByIdentity(ctx, User.Identity.Name);
// check FOR NULL !
// Defensive programming 101 - ALWAYS check, NEVER just assume!
if (user != null)
{
var title = user.Title;
ViewBag.Message = title;
}
else
{
// handle the case that NO user was found !
ViewBag.Message = "(no user found)";
}
}
return View();
}