Sam R Iyer
Sam R Iyer

Reputation: 53

Ionic NTLM Authentication - IIS

I am building an iOS mobile application using the Ionic framework. The app will be accessing APIs that will be served by an ASP.NET 5 (MVC 6) application hosted on IIS using Integrated Windows Authentication. The server already has a web interface to it that uses an AngularJS client. I have been trying to get a $http call to the server from within an Ionic/Angularjs controller and have had no luck getting through the IIS Integrated windows authentication (I have tried running on the device/simulator as well as ionic serve). I always get a 401 Unauthorized error. I have tried setting withCredentials to true and passing in a username/password in the request with no luck. When I try to access the API URL from safari on an iPhone (a non-windows environment), I do get the Browser Authentication popup which successfully logs me in on entering my intranet windows username password.

I initially had some CORS issues that I have sorted through by adding the CORS service on the server side and also allowing all origins. I also have the proxy setup to avoid CORS issue when testing using ionic serve. Has anyone done something like this before? This is my controller code:

angular.module('starter.controllers', [])

.controller('AppCtrl', function($scope, $ionicModal, $http) {
$http.defaults.useXDomain = true;
  $http.defaults.withCredentials = true;
  // Form data for the login modal
  $scope.loginData = {};
  // Create the login modal that we will use later
  $ionicModal.fromTemplateUrl('templates/login.html', {
    scope: $scope
  }).then(function(modal) {
    $scope.modal = modal;
  });
  // Triggered in the login modal to close it
  $scope.closeLogin = function() {
    $scope.modal.hide();
  };
  // Open the login modal
  $scope.login = function() {
    $scope.modal.show();
  };

  // Perform the login action when the user submits the login form
  $scope.doLogin = function() {
    console.log('Doing login', $scope.loginData);
    $http.post('http://localhost:8100/api/APIAccount/Login',{withCredentials:true})
    .then(function(response)
 {
   console.log('success');
 }, function(error)  {
   console.log('error');
 });

  };
});

Upvotes: 2

Views: 1332

Answers (1)

Sam R Iyer
Sam R Iyer

Reputation: 53

After several hours of troubleshooting, it was as simple as setting up ASP.NET 5 CORS service to allow credentials. In my Startup.cs file in the ConfigureServices function I had to put in the following. Hope this helps someone else in the future.

services.AddCors(options => 
               {
                options.AddPolicy("AllowAllOrigins",
                builder => builder.WithOrigins("http://<domainname>")
                .AllowCredentials());
               });

Upvotes: 2

Related Questions