[MVC/C#] Impersonate current user

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 21:36
Momenteel moet ik even een simpele website bouwen die het volgende doet.
Vanuit het CRM systeem wordt er een aanroep gedaan naar een website met bepaalde data
Deze ziet er als volgt uit:
http://localhost:17011/Home/Index?sleutel=28934375&systeem=43&label=1 (even localhost gepakt)

Deze roept dan via een WebClient een Webservice aan welke (in dit geval) op dezelfde webserver draait
Deze vereist een inlog welke hetzelfde is als de inlog welke gebruikt wordt om de webpagina te openen.
Nu wil ik deze login automatisch doorgeven door Impersonation, echter wil dit niet echt meewerken.
Ik heb het momenteel op de volgende manieren geprobeerd:
1. client.UseDefaultCredentials = true;
2. client.Credentials = CredentialCache.DefaultCredentials;
3. client.Credentials = CredentialCache.DefaultNetworkCredentials;

Middels de volgende methode:
http://stackoverflow.com/...ls-along-with-the-request
En ook deze:
http://stackoverflow.com/...ct-for-the-logged-in-user

En nog een partij aan zoekopdrachten later ben ik nog geen steek verder.
Wellicht dat iemand hier mij erbij kan helpen?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public FileResult Index()
        {
            //Model aanmaken
            DataModel model = new DataModel();

            //Querystrings welke uit CRM komen
            string document = Request.QueryString["sleutel"];
            string DocumentSourceID = Request.QueryString["systeem"];
            string Label = Request.QueryString["label"];

            //ADAccount uit User.Identity
            string ADAccount = User.Identity.Name.Substring(User.Identity.Name.LastIndexOf('\\') + 1);

            //URL Formatten met de querystrings
            Uri uri = new Uri(string.Format(ConfigurationManager.AppSettings.Get("URL"), document, ADAccount, DocumentSourceID, Label));

            //Nieuwe WebClient aanmaken
            var client = new WebClient();

            //Encoding op UTF8 zetten
            client.Encoding = Encoding.UTF8;

            //ContentType op XML zetten
            client.Headers.Add("Content-Type", "application/xml");

            //Credentials????
            #region credentials
            client.UseDefaultCredentials = true;
            #endregion

            try
            {
                //XML Downloaden
                var data = client.DownloadString(uri);

                //Parsen hier
            }
            catch (Exception ex)
            {
                logger.Trace(ex);
                throw ex;
            }

            //Base64 string (het document) converten naar een byteArray
            byte[] byteArray = Convert.FromBase64String(model.Data);

            //En dan geven we het bestand terug als download
            return File(byteArray, model.ContentType, model.Omschrijving);
        }

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Welke user wil je precies impersonaten?

Je zult goed moeten kijken welk proces onder welke user draait. Ik vermoed dat je de user van het CRM wil impersonaten bij het doen van een webrequest. Dan zal je eerst moeten zorgen dat je webrequest die bij je MVC applicatie binnen komt onder die user draait ( Default zal deze gewoon onder een AppPoolIdentity draaien ).

De User.Identity is de authenticated user, maar standaard niet de user waarmee het process uitgevoerd wordt.

[ Voor 13% gewijzigd door Woy op 19-07-2016 13:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 21:36
Woy schreef op dinsdag 19 juli 2016 @ 13:32:
Welke user wil je precies impersonaten?

Je zult goed moeten kijken welk proces onder welke user draait. Ik vermoed dat je de user van het CRM wil impersonaten bij het doen van een webrequest. Dan zal je eerst moeten zorgen dat je webrequest die bij je MVC applicatie binnen komt onder die user draait ( Default zal deze gewoon onder een AppPoolIdentity draaien ).

De User.Identity is de authenticated user, maar standaard niet de user waarmee het process uitgevoerd wordt.
Ik wil de user impersonaten die ook de website opent.

In dit geval open ik de pagina dus op Testserver 01 met als gebruikersnaam AD\Crazy
Dan moet AD\Crazy ook gebruikt worden bij de webrequest.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dan zul je die user dus moeten impersonaten. Het IIS process draait default ( afhankelijk van de AppPool ) onder een AppPoolIdentity. Ook al authenticeer je wel gebruikers, dan veranderd nog niks aan de executie context.

C#:
1
2
3
4
5
6
7
8
9
10
11
public ActionResult Index()
{
    using (var wic = ((WindowsIdentity) User.Identity).Impersonate())
    {
        var webClient = new WebClient() {UseDefaultCredentials = true};

        webClient.DownloadString("http://....");
    }

    return View();
}

De User.Identity zal bij windows authentication een WindowsIdentity zijn waar je Impersonate op aan kunt roepen. Op dat moment zal alles uitgevoerd worden als zijnde die user. Dan zal het webrequest dus ook als die user uitgevoerd worden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 21:36
Woy schreef op dinsdag 19 juli 2016 @ 15:20:
Dan zul je die user dus moeten impersonaten. Het IIS process draait default ( afhankelijk van de AppPool ) onder een AppPoolIdentity. Ook al authenticeer je wel gebruikers, dan veranderd nog niks aan de executie context.

C#:
1
2
3
4
5
6
7
8
9
10
11
public ActionResult Index()
{
    using (var wic = ((WindowsIdentity) User.Identity).Impersonate())
    {
        var webClient = new WebClient() {UseDefaultCredentials = true};

        webClient.DownloadString("http://....");
    }

    return View();
}

De User.Identity zal bij windows authentication een WindowsIdentity zijn waar je Impersonate op aan kunt roepen. Op dat moment zal alles uitgevoerd worden als zijnde die user. Dan zal het webrequest dus ook als die user uitgevoerd worden.
Ik heb bovenstaande ook even geprobeerd inderdaad, echter dit wil ook niet werken.
Als ik het als localhost run, dan zie ik in de webclient credentials dat deze leeg zijn.

Als ik deze op de server zet en inlog met de juiste user krijg ik alsnog een foutmelding.

2016-07-19 15:37:58.9160 TRACE System.Net.WebException: The remote server returned an error: (401) Unauthorized.
at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
at System.Net.WebClient.DownloadString(Uri address)
at DocViewer.Controllers.HomeController.Index()