Wie rufe ich eine MVC-Aktion über einen WebRequest und validieren der request über Active Directory?

Ich weiß, der Titel ist ein Bissen. Ich habe die meisten Dinge bereits vorhanden. Ich brauche nur Bestätigung, ob ich das tun kann, was ich bin versucht.

Ich bin mit ASP.NET MVC-3. Ich habe eine Anwendung, die controller, die ich benutze, wie ein web service. Es gibt eine einzige Methode auf dem controller, und es gibt eine Zeichenfolge zurück, das ist json. Diese Methode authentifiziert den Benutzer gegen das active directory.

Die Anwendung, die führt einen WebRequest zu der oben genannten ist auch ein MVC-Anwendung. Diese Anwendung (in der Reihenfolge zur Abfrage AD, ohne einen bestimmten Benutzernamen und Kennwort) ist durch Identitätswechsel in der web.config. Die Anwendung imitiert ein Konto, das die Berechtigung zur Abfrage AD, aber die Informationen, die der Benutzer auf der Seite (wie, zu welchen Gruppen Sie sich befinden), ist das, was ich überprüft.

Kurz (und ich nicht ganz verstehen diesen Teil) der Identitätswechsel ist streng, so ASP.NET Active Directory Abfragen können. Nutzer laden der Seite noch gesehen, als Sie selbst, wenn ich die active directory-Abfragen für Ihre Informationen.

Den AD-code sieht wie folgt aus (dieser code funktioniert):

   public static ADUserInfo GetUserInfo(IPrincipal User)
    {
        StringBuilder userAdInfo = new StringBuilder();
        ADUserInfo userInfo = new ADUserInfo();
        String domain = ConfigurationManager.AppSettings["ADdomain"];

        try
        {
            using (var context = new PrincipalContext(ContextType.Domain, domain))
            {
                if (User == null)
                    userAdInfo.AppendLine("User is null.");
                else if (User.Identity == null)
                    userAdInfo.AppendLine(" User is not null. User.Identitiy is.");
                else
                    userAdInfo.AppendLine(" Neither User nor User.Identity is null. " +
                        User.Identity.Name);

                using (var user = 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 (Exception e)
        {
            LogUtil.WriteException(e);
        }
        return userInfo;
    }

Die IIS-Website für diese Anwendung nicht den anonymen Zugriff zulassen.

Die service-Methode, verwendet die AD-Daten funktioniert einwandfrei. Das Problem scheint zu sein, übergeben von Anmeldedaten, über einen WebRequest aufrufen dieser Methode und erhalten JSON zurückgegeben.

Mein WebRequest-code, um die Aktion sieht wie folgt aus:

    public class WebRequestUtil
    {
        public static StreamReader GetWebRequestStream(
             string url,
             string contentType,
             bool useDefaultCredentials)
        {
            var request = WebRequest.Create(url);
            request.ContentType = contentType;
            request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
            //request.UseDefaultCredentials = useDefaultCredentials;
            //ICredentials ic = new NetworkCredential();

            //request.Credentials = 
            var response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream());
        }
    }

Ich Spiele mit dem ImpersonationLevel...noch nicht gearbeitet, aber....

Des MVC-3-Aktion aufgerufen, über den WebRequest in etwa so aussieht:

public class ProxyServiceController : Controller
    {

        public ProxyServiceController()
        {

        }

       public string CheckForProxy(string applicationName, string associateId)
        {
            RequestResultDetails requestDetails = new RequestResultDetails();
            string json = string.Empty;

            //This correctly gets the Active directory information for the user
            //and fills out a custom ADUserInfo object.
            **ADUserInfo adUserInfo = ADService.GetUserInfo(this.User);**

            try
            {

                if (!ADService.DoesUrlDataMatchAD(
                                adUserInfo,
                                associateId)
                    )
                {
                    throw new Exception(StaticText.UserDataMismatch);
                }

                resultList = //query db for data given the associateId

                if (resultList.ListIsNotNullOrEmpty())
                {
                    requestDetails.RelationshipExists = true;
                }
                else
                {
                    requestDetails.RelationshipExists = false;
                }

                requestDetails.Details = resultList;

            }
            catch (Exception e)
            {
                LogUtil.WriteException(e);
                requestDetails.ErrorProcessingRequest = true;
                requestDetails.ErrorDetails = ErrorProcessing.GetFullExceptionDetails(e);
            }

            json = JsonConvert.SerializeObject(requestDetails);

            LogUtil.Write("json: " + json);

            return json;

        }
}       

So was passiert, ist, dass, wenn ich gehen, um das MVC-3 Controller/Action direkt im browser über eine url wie:

http://:90/MyApp/Service.aspx/CheckForProxy/Reporting/555

Sehe ich das richtig JSON auf der Seite. Allerdings, wenn ich eine WebRequest-Aufruf die gleiche URL von einer anderen Anwendung, die auf dem gleichen server, Active Directory scheint nicht, wie es sein kann, abgefragt. Dies ist definitiv eine Art von Berechtigungen-Problem, aber ich bin mir nicht sicher, wie es zu lösen, damit der service sieht der Benutzer die Active Directory-Informationen.

Das problem hier ist, dass die übergebenen Anmeldeinformationen für den Dienst sind diejenigen, die das Konto der aufrufenden Anwendung ist die Identität. Was muss ich ändern, um die service-mvc-Anwendung, um den Benutzer die Durchführung der WebRequest (gut die app macht den call, aber der Benutzer lädt die app) und nicht den account, die Anwendung ist Identität?

Ich bin offen für andere Gedanken oder Methoden für den Umgang mit dieser Kommunikation.

LÖSUNG PRO jmrnet KOMMENTAR

Wow, dieser Kommentar war vor Ort auf. Ich habe keine Ahnung, welche Art von web-magic gearbeitet, aber ich überarbeitete meine web-request-Methode auf:

  public static StreamReader GetWebRequestStream(
         string url,
         string contentType,
         bool useDefaultCredentials,
         IPrincipal user)
    {

        var impersonationContext = ((WindowsIdentity)user.Identity).Impersonate();            
        var request = WebRequest.Create(url);

        try
        {
            request.ContentType = contentType;
            request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
            request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
            var response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream());
        }
        catch (Exception e)
        {
            impersonationContext.Undo();
            throw e;
        }

    }

Und diese präzise Pässe auf den AUFTRAGGEBER über die Identität des Benutzers.

InformationsquelleAutor jason | 2012-12-07

Schreibe einen Kommentar