ASP.NET MVC4中的Active Directory字段 - 未处理的异常

时间:2014-10-02 07:30:37

标签: c# asp.net asp.net-mvc asp.net-mvc-4 active-directory

我需要实现一个从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")],但没有任何结果。

1 个答案:

答案 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();
}