当前位置: 首页 > 编程语言 > C#

如何通过WebRequest调用MVC操作并传递ActiveDirectory认证请求?分享

时间:2023-04-10 11:40:00 C#

如何通过WebRequest调用MVC操作并通过ActiveDirectory验证请求?我知道标题很啰嗦。我已经拥有了大部分的东西。我只需要确认我可以做我正在尝试的事情。我正在使用ASP.NETMVC3。我有一个应用程序,它有我使用的控制器,比如Web服务。控制器上有一个方法返回一个字符串,它是json。此方法根据ActiveDirectory对用户进行身份验证。对上述应用程序执行WebRequest的应用程序也是MVC应用程序。此应用程序(为了在没有特定用户名和密码的情况下查询AD)在web.config中使用模拟。App冒充有权限查询AD的账号;但是,页面上的用户信息(例如他们所在的组)是我已验证的。简而言之(我并不完全理解这部分),模拟是严格的,因此ASP.NET可以查询ActiveDirectory。当我在活动目录中查询他们的信息时,加载页面的用户仍然算作他自己。广告代码如下所示(此代码有效):publicstaticADUserInfoGetUserInfo(IPrincipalUser){StringBuilderuserAdInfo=newStringBuilder();ADUserInfouserInfo=newADUserInfo();Stringdomain=ConfigurationManager.AppSettings["ADdomain"];尝试{使用(varcontext=newPrincipalContext(ContextType.Domain,domain)){if(User==null)userAdInfo.AppendLine("Userisnull.");elseif(User.Identity==null)userAdInfo.AppendLine("Userisnotnull.User.Identitiyis.");elseuserAdInfo.AppendLine("User和User.Identity都不为空。"+User.Identity.Name);使用(varuser=UserPrincipal.FindByIdentity(context,User.Identity.Name)){userInfo.FullName=user.Name;userInfo.Email=user.EmailAddress;userInfo.AssociateId=user.EmployeeId;userInfo.DomainName=User.Identity.Name;userInfo.SamAccountName=user.SamAccountName;userInfo.DistinguishedUserName=user.DistinguishedName;}}}catch(Exceptione){LogUtil.WriteException(e);}返回用户信息;}此应用程序的IIS站点不允许匿名访问使用AD信息的服务方法工作正常。问题似乎是通过WebRequest传递凭据调用此方法并返回JSON。我调用该操作的WebRequest代码如下所示:request.ContentType=contentType;request.ImpersonationLevel=System.Security.Principal.TokenImpersonationLevel.Impersonation;//request.UseDefaultCredentials=useDefaultCredentials;//ICredentialsic=newNetworkCredential();//request.Credentials=varresponse=(HttpWebResponse)request.GetResponse();响应.GetResponseStream());我正在玩ImpersonationLevel...还没有工作....通过WebRequest调用的MVC3操作类似于:){RequestResultDetailsrequestDetails=newRequestResultDetails();字符串json=string.Empty;//这正确获取活动目录信息//并填写自定义ADUserInfo对象。**ADUserInfoadUserInfo=ADService.GetUserInfo(this.User);**}resultList=//查询db给定associateId的数据if(resultList.ListIsNotNullOrEmpty()){requestDetails.RelationshipExists=true;}else{requestDetails.RelationshipExists=false;}requestDetails.Details=resultList;异常e){LogUtil.WriteException(e);requestDetails.ErrorProcessingRequest=true;requestDetails.ErrorDetails=ErrorProcessing.GetFullExceptionDetails(e);}json=JsonConvert.SerializeObject(requestDetails);LogUtil.Write("json):returnjson;}}如果我通过以下url在浏览器中直接访问MVC3Controller/Action会发生什么:http://:90/MyApp/Service.aspx/CheckForProxy/Reports/555我可以获得但是,如果我从同一服务器上的另一个应用程序对同一URL进行WebRequest调用,ActiveDirectory似乎无法轮询它。这绝对是某种权限问题,但我不确定如何修复它以便服务看到用户的ActiveDirectory信息。这里的问题是传递给服务的凭据是调用应用程序模拟的帐户的凭据。如何更改服务mvc应用程序以查看发出WebRequest的用户(应用程序是否发出调用,但用户是否加载应用程序)而不是应用程序模拟的帐户?我愿意接受处理此通信的其他想法或方式。每个jmrnet评论的解决方案哇,该评论很有趣。我不知道这是什么网络魔法,但我修改了我的网络请求方法:模仿();varrequest=WebRequest.Create(url);尝试{request.ContentType=contentType;request.AuthenticationLevel=System.Net.Security.AuthenticationLevel.MutualAuthRequested;request.Credentials=System.Net.CredentialCache.DefaultNetworkCredentials;varresponse=(HttpWebResponse)request.GetResponse();返回新的StreamReader(response.GetResponseStream());}catch(Exceptione){impersonationContext.Undo();扔e;}}这完全传递了主要用户的身份。两个想法:1)您可以在进行WebRequest调用之前尝试强制模拟。像这样:varimpersonationContext=((WindowsIdentity)User.Identity).Impersonate();//在这里调用你的WebRequest...impersonationContext.Undo();2)您可以在WebRequest调用中传递用户,在服务器端从AD获取用户身份,然后使用上述代码的变体来模拟他们。这是一个链接,更多地讨论了上面使用的模拟代码:http://msdn.microsoft.com/en-us/library/w070t6ka.aspx这就是C#学习教程:如何通过WebRequest调用MVC操作并传递活动目录身份验证请求?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: