From b7c85930edd7fd6255a2523df5b827c95d9faa2d Mon Sep 17 00:00:00 2001 From: Zack Allen Date: Tue, 28 Apr 2020 11:32:29 -0700 Subject: [PATCH] Remove IWA samples for Android platforms (#780) --- ...cGISRuntime.Xamarin.Samples.Android.csproj | 2 - .../IntegratedWindowsAuth.cs | 561 ------------------ .../IntegratedWindowsAuth.jpg | Bin 48690 -> 0 bytes .../Security/IntegratedWindowsAuth/readme.md | 46 -- .../readme.metadata.json | 31 - src/Android/readme.md | 1 - src/Forms/Shared/Forms.projitems | 16 - .../IntegratedWindowsAuth.jpg | Bin 57014 -> 0 bytes .../IntegratedWindowsAuth.xaml | 56 -- .../IntegratedWindowsAuth.xaml.cs | 371 ------------ .../IntegratedWindowsAuth/LoginPage.xaml | 42 -- .../IntegratedWindowsAuth/LoginPage.xaml.cs | 77 --- .../Security/IntegratedWindowsAuth/readme.md | 46 -- .../readme.metadata.json | 34 -- src/Forms/readme.md | 1 - 15 files changed, 1284 deletions(-) delete mode 100644 src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.cs delete mode 100755 src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.jpg delete mode 100644 src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.md delete mode 100644 src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.metadata.json delete mode 100644 src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.jpg delete mode 100644 src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.xaml delete mode 100644 src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.xaml.cs delete mode 100644 src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/LoginPage.xaml delete mode 100644 src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/LoginPage.xaml.cs delete mode 100644 src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/readme.md delete mode 100644 src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/readme.metadata.json diff --git a/src/Android/Xamarin.Android/ArcGISRuntime.Xamarin.Samples.Android.csproj b/src/Android/Xamarin.Android/ArcGISRuntime.Xamarin.Samples.Android.csproj index 462caa9375..39dc1e7c7b 100644 --- a/src/Android/Xamarin.Android/ArcGISRuntime.Xamarin.Samples.Android.csproj +++ b/src/Android/Xamarin.Android/ArcGISRuntime.Xamarin.Samples.Android.csproj @@ -260,7 +260,6 @@ - @@ -461,7 +460,6 @@ - diff --git a/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.cs b/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.cs deleted file mode 100644 index e2428562fb..0000000000 --- a/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.cs +++ /dev/null @@ -1,561 +0,0 @@ -// Copyright 2018 Esri. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. -// You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific -// language governing permissions and limitations under the License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Android.App; -using Android.OS; -using Android.Support.V7.View; -using Android.Text; -using Android.Views; -using Android.Views.InputMethods; -using Android.Widget; -using Esri.ArcGISRuntime.Mapping; -using Esri.ArcGISRuntime.Portal; -using Esri.ArcGISRuntime.Security; -using Esri.ArcGISRuntime.UI.Controls; -using ContextThemeWrapper = Android.Support.V7.View.ContextThemeWrapper; - -// ***************************************** -// Important: Integrated Windows Authentication does not work with the AndroidClientHandler Http handler. -// To use IWA successfully, change the project properties to use the Managed handler (HttpClientHandler). -// ***************************************** -namespace ArcGISRuntimeXamarin.Samples.IntegratedWindowsAuth -{ - [Activity (ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize)] - [ArcGISRuntime.Samples.Shared.Attributes.Sample( - "Integrated Windows Authentication", - "Security", - "This sample demonstrates how to use a Windows login to authenticate with a portal that is secured with IWA.", - "1. Enter the URL to your IWA-secured portal.\n2. Click the button to search for web maps on the secure portal.\n3. You will be prompted for a user name, password, and domain to authenticate with the portal.\n4. If you authenticate successfully, search results will display.", - "Authentication, Security, Windows")] - public class IntegratedWindowsAuth : Activity - { - // The ArcGIS Online URL for searching public web maps. - private string _publicPortalUrl = "https://www.arcgis.com"; - - // A TaskCompletionSource to store the result of a login task. - TaskCompletionSource _loginTaskCompletionSrc; - - // A map view to display a map in the app. - MapView _myMapView; - - // Entry box for the iwa-secured portal. - private EditText _securePortalEditText; - - // Label for messages. - private TextView _messagesTextView; - - // Button for searching the public portal for web maps. - private Button _searchPublicPortalButton; - - // Button for searching the private portal for web maps. - private Button _searchSecurePortalButton; - - // List view to show web map items. - private ListView _webMapListView; - - protected override void OnCreate(Bundle savedInstanceState) - { - base.OnCreate(savedInstanceState); - - Title = "Integrated Windows Authentication"; - - // Call a function to create the user interface. - CreateLayout(); - - // Call a function to initialize the app. - Initialize(); - } - - private void CreateLayout() - { - // Create a new vertical layout for the app. - LinearLayout layout = new LinearLayout(this) { Orientation = Orientation.Vertical }; - - // Create the entry for the secure portal URL. - _securePortalEditText = new EditText(this) { Hint = "IWA-secured portal URL" }; - _securePortalEditText.InputType = InputTypes.TextVariationUri; - - // Hide the keyboard on enter. - _securePortalEditText.KeyPress += (sender, args) => - { - if (args.Event.Action == KeyEventActions.Down && args.KeyCode == Keycode.Enter) - { - InputMethodManager imm = (InputMethodManager)GetSystemService(InputMethodService); - imm.HideSoftInputFromWindow(_securePortalEditText.WindowToken, 0); - SearchSecurePortalButton_Click(this, null); - } - else - { - args.Handled = false; - } - }; - - // A label to show errors and other messages. - _messagesTextView = new TextView(this); - - // Buttons to search a public and private portal. - _searchPublicPortalButton = new Button(this) { Text = "Search public" }; - _searchSecurePortalButton = new Button(this) { Text = "Search secure" }; - - // Event handlers to perform the appropriate search. - _searchSecurePortalButton.Click += SearchSecurePortalButton_Click; - _searchPublicPortalButton.Click += SearchPublicPortalButton_Click; - - // Add the buttons to a horizontal layout. - LinearLayout buttonLayout = new LinearLayout(this) { Orientation = Orientation.Horizontal }; - buttonLayout.AddView(_searchPublicPortalButton); - buttonLayout.AddView(_searchSecurePortalButton); - - // Create a list view to show web map item results. - _webMapListView = new ListView(this) - { - ChoiceMode = ChoiceMode.Single - }; - - // Handle item click events to load the selected web map. - _webMapListView.ItemClick += WebMapListView_ItemSelected; - - // Create a scroll view for the list. - ScrollView listScroll = new ScrollView(this); - listScroll.SetMinimumHeight(Resources.DisplayMetrics.HeightPixels / 5); - listScroll.FillViewport = true; - - // Add the listview to the scroll view. - listScroll.AddView(_webMapListView); - - // Add the controls to the layout. - layout.AddView(_securePortalEditText); - layout.AddView(buttonLayout); - layout.AddView(listScroll); - layout.AddView(_messagesTextView); - _myMapView = new MapView(this); - layout.AddView(_myMapView); - - // Show the layout in the app. - SetContentView(layout); - } - - private void WebMapListView_ItemSelected(object sender, AdapterView.ItemClickEventArgs e) - { - // When a row in the list is selected, get the associated web map item. - PortalItemAdapter itemAdapter = _webMapListView.Adapter as PortalItemAdapter; - PortalItem selectedItem = itemAdapter[e.Position]; - - // Create a new map from the portal item and display it in the map view. - Map webMap = new Map(selectedItem); - _myMapView.Map = webMap; - } - - - private void Initialize() - { - // Define a challenge handler method for the AuthenticationManager. - // This method handles getting credentials when a secured resource is encountered. - AuthenticationManager.Current.ChallengeHandler = new ChallengeHandler(CreateCredentialAsync); - - // Show a default map (light gray canvas). - Map defaultMap = new Map(Basemap.CreateLightGrayCanvasVector()) - { - InitialViewpoint = new Viewpoint(0.0, 0.0, 200000000) - }; - _myMapView.Map = defaultMap; - } - - - async void SearchSecurePortalButton_Click(object sender, EventArgs e) - { - try - { - // Clear the current results from the list. - _webMapListView.Adapter = null; - - // Get the value entered for the secure portal URL. - string securedPortalUrl = _securePortalEditText.Text.Trim(); - - // Make sure a portal URL has been entered in the text box. - if (string.IsNullOrEmpty(securedPortalUrl)) - { - _messagesTextView.Text = "Please enter the URL of the secured portal."; - return; - } - - // Create an instance of the IWA-secured portal, the user may be challenged for access. - var iwaSecuredPortal = await ArcGISPortal.CreateAsync(new Uri(securedPortalUrl), true); - - // Call a function to search the portal. - SearchPortal(iwaSecuredPortal); - - // Report the username for this connection. - if (iwaSecuredPortal.User != null) - { - _messagesTextView.Text = "Connected as: " + iwaSecuredPortal.User.UserName; - } - else - { - // This shouldn't happen (if the portal is truly secured)! - _messagesTextView.Text = "Connected anonymously"; - } - } - catch (TaskCanceledException) - { - // Report canceled login. - _messagesTextView.Text = "Login was canceled"; - } - catch (Exception ex) - { - // Report errors (connecting to the secured portal, for example). - _messagesTextView.Text = ex.Message; - } - finally - { - // Set the task completion source to null so user can attempt another login (if it failed). - _loginTaskCompletionSrc = null; - } - } - - private async void SearchPublicPortalButton_Click(object sender, EventArgs e) - { - try - { - // Clear the current results from the list. - _webMapListView.Adapter = null; - - // Create an instance of the public portal. - var publicPortal = await ArcGISPortal.CreateAsync(new Uri(_publicPortalUrl)); - - // Call a function to search the portal. - SearchPortal(publicPortal); - } - catch (Exception ex) - { - // Report errors, if any. - _messagesTextView.Text = ex.Message; - } - } - - - private async void SearchPortal(ArcGISPortal currentPortal) - { - // Show status message. - _messagesTextView.Text = "Searching for web map items on the portal at " + currentPortal.Uri.AbsoluteUri; - var messageBuilder = new StringBuilder(); - - try - { - // Report connection info. - messageBuilder.AppendLine("Connected to the portal on " + currentPortal.Uri.Host); - - // Report the user name used for this connection. - if (currentPortal.User != null) - { - messageBuilder.AppendLine("Connected as: " + currentPortal.User.UserName); - } - else - { - // Note: This shouldn't happen for a secure portal! - messageBuilder.AppendLine("Anonymous"); - } - - // Search the portal for web maps. - var items = await currentPortal.FindItemsAsync(new PortalQueryParameters("type:(\"web map\" NOT \"web mapping application\")")); - - // Build a list of items from the results. - var resultItems = from r in items.Results select new KeyValuePair(r.Title, r); - - // Add the items to a dictionary. - List webMapItems = new List(); - foreach (var itm in resultItems) - { - webMapItems.Add(itm.Value); - } - - // Create an array adapter for the result list. - PortalItemAdapter adapter = new PortalItemAdapter(this, webMapItems); - - // Apply the adapter to the list view to show the results. - _webMapListView.Adapter = adapter; - - } - catch (Exception ex) - { - // Report errors searching the portal. - messageBuilder.AppendLine(ex.Message); - } - finally - { - // Show messages. - _messagesTextView.Text = messageBuilder.ToString(); - } - } - - // AuthenticationManager.ChallengeHandler function that prompts the user for login information to create a credential. - private Task CreateCredentialAsync(CredentialRequestInfo info) - { - // Ignore token or certificate challenges (needs additional code and UI). - if(info.AuthenticationType != AuthenticationType.NetworkCredential) - { - Console.WriteLine("Skipped authentication for " + info.ServiceUri.Host); - return null; - } - - // See if authentication is already in progress. - if (_loginTaskCompletionSrc != null) { return null; } - - // Create a new TaskCompletionSource for the login operation. - // Passing the CredentialRequestInfo object to the constructor will make it available from its AsyncState property. - _loginTaskCompletionSrc = new TaskCompletionSource(info); - - // Create a dialog (fragment) with login controls. - LoginDialogFragment enterLoginDialog = new LoginDialogFragment(); - - // Handle the login and the cancel events. - enterLoginDialog.OnLoginClicked += LoginClicked; - enterLoginDialog.OnLoginCanceled += (s, e) => - { - _loginTaskCompletionSrc?.TrySetCanceled(); - _loginTaskCompletionSrc = null; - }; - - // Begin a transaction to show a UI fragment (the login dialog). - FragmentTransaction transax = FragmentManager.BeginTransaction(); - enterLoginDialog.Show(transax, "login"); - - // Return the login task, the result will be ready when completed (user provides login info and clicks the "Login" button). - return _loginTaskCompletionSrc.Task; - } - - // Handler for the OnLoginClicked event defined in the LoginDialogFragment, OnEnterCredentialsEventArgs contains the username, password, and domain the user entered - private void LoginClicked(object sender, OnEnterCredentialsEventArgs e) - { - // If no login information is available from the Task, return. - if (_loginTaskCompletionSrc == null || _loginTaskCompletionSrc.Task == null || _loginTaskCompletionSrc.Task.AsyncState == null) - { - return; - } - - // Get the CredentialRequestInfo object that was stored with the task. - var credRequestInfo = _loginTaskCompletionSrc.Task.AsyncState as CredentialRequestInfo; - - try - { - // Create a new System.Net.NetworkCredential with the user name, password, and domain provided. - var networkCredential = new System.Net.NetworkCredential(e.Username, e.Password, e.Domain); - - // Create a new ArcGISNetworkCredential with the NetworkCredential and URI of the secured resource. - var credential = new ArcGISNetworkCredential - { - Credentials = networkCredential, - ServiceUri = credRequestInfo.ServiceUri - }; - - // Set the result of the login task with the new ArcGISNetworkCredential. - _loginTaskCompletionSrc.TrySetResult(credential); - } - catch (Exception ex) - { - _loginTaskCompletionSrc.TrySetException(ex); - } - finally - { - // Set the task completion source to null to indicate authentication is complete. - _loginTaskCompletionSrc = null; - } - } - } - - // Custom DialogFragment class to show input controls for providing network login information (username, password, domain). - public class LoginDialogFragment : DialogFragment - { - // Login entries for the user to complete. - private EditText _usernameTextbox; - private EditText _passwordTextbox; - private EditText _domainTextbox; - - // Event raised when the login button is clicked. - public event EventHandler OnLoginClicked; - - // Event raised when the login is canceled (Cancel button is clicked). - public event EventHandler OnLoginCanceled; - - // Override OnCreateView to create the dialog controls. - public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - base.OnCreateView(inflater, container, savedInstanceState); - var ctx = this.Activity.ApplicationContext; - ContextThemeWrapper ctxWrapper = new ContextThemeWrapper(ctx, Android.Resource.Style.ThemeMaterialLight); - - // The container for the dialog is a vertical linear layout. - LinearLayout dialogView = new LinearLayout(ctxWrapper) { Orientation = Orientation.Vertical }; - - // Add a text box for entering a username. - _usernameTextbox = new EditText(ctxWrapper) - { - Hint = "Username" - }; - dialogView.AddView(_usernameTextbox); - - // Add a text box for entering a password. - _passwordTextbox = new EditText(ctxWrapper) - { - Hint = "Password", - InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText - }; - dialogView.AddView(_passwordTextbox); - - // Add a text box for entering the domain. - _domainTextbox = new EditText(ctxWrapper) - { - Hint = "Domain" - }; - dialogView.AddView(_domainTextbox); - - // Use a horizontal layout for the two buttons (login and cancel). - LinearLayout buttonsRow = new LinearLayout(ctxWrapper) { Orientation = Orientation.Horizontal }; - - // Create a button to login with these credentials. - Button loginButton = new Button(ctxWrapper) - { - Text = "Login" - }; - loginButton.Click += LoginButtonClick; - buttonsRow.AddView(loginButton); - - // Create a button to cancel. - Button cancelButton = new Button(ctxWrapper) - { - Text = "Cancel" - }; - cancelButton.Click += CancelButtonClick; - buttonsRow.AddView(cancelButton); - - dialogView.AddView(buttonsRow); - - // Return the new view for display. - return dialogView; - } - - // Click handler for the login button. - private void LoginButtonClick(object sender, EventArgs e) - { - try - { - // Get information for the login. - var username = _usernameTextbox.Text; - var password = _passwordTextbox.Text; - var domain = _domainTextbox.Text; - - // Make sure all required info was entered. - if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(domain)) - { - throw new Exception("Please enter a username, password, and domain."); - } - - // Create a new OnEnterCredentialsEventArgs object to store the information entered by the user. - var credentialsEnteredArgs = new OnEnterCredentialsEventArgs(username, password, domain); - - // Raise the OnLoginClicked event so the main activity can handle the event and try to authenticate with the credentials. - OnLoginClicked(this, credentialsEnteredArgs); - - // Close the dialog. - this.Dismiss(); - } - catch (Exception ex) - { - // Show the exception message (dialog will stay open so user can try again). - var alertBuilder = new AlertDialog.Builder(this.Activity); - alertBuilder.SetTitle("Error"); - alertBuilder.SetMessage(ex.Message); - alertBuilder.Show(); - } - } - - // Click handler for the cancel button. - private void CancelButtonClick(object sender, EventArgs e) - { - // Raise an event to indicate that the login was canceled. - OnLoginCanceled(this, e); - - // Close the dialog. - this.Dismiss(); - } - } - - // Custom EventArgs class for containing login info. - public class OnEnterCredentialsEventArgs : EventArgs - { - public string Username { get; set; } - public string Password { get; set; } - public string Domain { get; set; } - - // Constructor gets username, password, and domain and stores them in properties. - public OnEnterCredentialsEventArgs(string username, string password, string domain) : base() - { - Username = username; - Password = password; - Domain = domain; - } - } - -} - -// A custom item adapter for showing a list of portal items. -public class PortalItemAdapter : BaseAdapter -{ - // Store a list of the portal items displayed. - List _portalItems; - - // The current activity. - Activity _context; - - // Take the list of portal items and the current activity in the constructor. - public PortalItemAdapter(Activity context, List items) : base() - { - _context = context; - _portalItems = items; - } - - // Get the ID of the item at a given position (just return the position). - public override long GetItemId(int position) - { - return position; - } - - // Get the portal item at a given position. - public override PortalItem this[int position] - { - get { return _portalItems[position]; } - } - - // Get the count of portal items in the list. - public override int Count - { - get { return _portalItems.Count; } - } - - // Construct a view to display a row in the table. - public override View GetView(int position, View convertView, ViewGroup parent) - { - // Re-use an existing view, if one is available. - View view = convertView; - - // Create a new view if necessary. - if (view == null) { view = _context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem1, null); } - - // Set the text for the row with the portal item title. - view.FindViewById(Android.Resource.Id.Text1).Text = _portalItems[position].Title; - - // Return the view for this row. - return view; - } -} \ No newline at end of file diff --git a/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.jpg b/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.jpg deleted file mode 100755 index b01b463c05df4d6c48ee7e7276cdf05d8a950a73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48690 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 V-&)iEbA|OkRbT)6Gsxk`KLa9|cF+I- diff --git a/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.md b/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.md deleted file mode 100644 index 5f36b5ae8e..0000000000 --- a/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.md +++ /dev/null @@ -1,46 +0,0 @@ -# Integrated windows authentication - -Use Windows credentials to access services hosted on a portal secured with Integrated Windows Authentication (IWA). - -![](IntegratedWindowsAuth.jpg) - -## How to use the sample - -1. Enter the URL to your IWA-secured portal. -2. Click the button to search for web maps stored on the portal. -3. You will be prompted for a user name, password, and domain (some platforms will use the current Windows login). -4. If you authenticate successfully, portal item results will display in the list. -5. Select a web map item to display it in the map view. - -## How it works - -1. The `AuthenticationManager` object is configured with a challenge handler that will prompt for a Windows login (username, password, and domain) if a secure resource is encountered. -2. When a search for portal items is performed against an IWA-secured portal, the challenge handler creates an `ArcGISNetworkCredential` object from the information entered by the user. -3. If the user authenticates, the search returns a list of web maps (`ArcGISPortalItem`) and the user can select one to display as a `Map`. -4. On some platforms, the current Windows account is used by default and a login prompt will not be shown if it can authenticate successfully. - -## Relevant API - -* AuthenticationManager -* ArcGISPortal -* ArcGISNetworkCredential - -## About the data - -This sample searches for web map portal items on a secure portal. To successfully run the sample, you need: - -* Access to a portal secured with Integrated Windows Authentication that contains one or more web map items. -* A login that grants you access to the portal. - -## Additional information - -IWA, which is built into Microsoft Internet Information Server (IIS), works well for intranet applications but isn't always practical for internet apps. - -More information about IWA and it's use with ArcGIS can be found at the following links: - -* [IWA - Wikipedia](https://en.wikipedia.org/wiki/Integrated_Windows_Authentication) -* [Use Integrated Windows Authentication with your portal](http://enterprise.arcgis.com/en/portal/latest/administer/windows/use-integrated-windows-authentication-with-your-portal.htm) - -## Tags - -Authentication, Security, Windows, Portal diff --git a/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.metadata.json b/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.metadata.json deleted file mode 100644 index 2ff3d41d25..0000000000 --- a/src/Android/Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.metadata.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "category": "Security", - "description": "Use Windows credentials to access services hosted on a portal secured with Integrated Windows Authentication (IWA).", - "formal_name": "IntegratedWindowsAuth", - "ignore": false, - "images": [ - "IntegratedWindowsAuth.jpg" - ], - "keywords": [ - "Authentication", - "Portal", - "Security", - "Windows" - ], - "nuget_packages": { - "Esri.ArcGISRuntime": "100.7.0" - }, - "offline_data": [], - "redirect_from": [ - "/net/latest/android/sample-code/integratedwindowsauth.htm" - ], - "relevant_apis": [ - "ArcGISNetworkCredential", - "ArcGISPortal", - "AuthenticationManager" - ], - "snippets": [ - "IntegratedWindowsAuth.cs" - ], - "title": "Integrated windows authentication" -} \ No newline at end of file diff --git a/src/Android/readme.md b/src/Android/readme.md index cffb9b04c7..c0af740cc6 100644 --- a/src/Android/readme.md +++ b/src/Android/readme.md @@ -220,7 +220,6 @@ ## Security -* [Integrated windows authentication](Xamarin.Android/Samples/Security/IntegratedWindowsAuth/readme.md) - Use Windows credentials to access services hosted on a portal secured with Integrated Windows Authentication (IWA). * [Authenticate with OAuth](Xamarin.Android/Samples/Security/OAuth/readme.md) - This sample demonstrates how to authenticate with ArcGIS Online (or your own portal) using OAuth2 to access secured resources (such as private web maps or layers). Accessing secured items requires a login on the portal that hosts them (an ArcGIS Online account, for example). * [ArcGIS token challenge](Xamarin.Android/Samples/Security/TokenSecuredChallenge/readme.md) - This sample demonstrates how to prompt the user for a username and password to authenticate with ArcGIS Server to access an ArcGIS token-secured service. Accessing secured services requires a login that's been defined on the server. diff --git a/src/Forms/Shared/Forms.projitems b/src/Forms/Shared/Forms.projitems index 4634a79669..502bbb24ed 100644 --- a/src/Forms/Shared/Forms.projitems +++ b/src/Forms/Shared/Forms.projitems @@ -533,12 +533,6 @@ FindServiceArea.xaml - - LoginPage.xaml - - - IntegratedWindowsAuth.xaml - OAuth.xaml @@ -1080,10 +1074,6 @@ MSBuild:UpdateDesignTimeXaml - - Designer - MSBuild:UpdateDesignTimeXaml - MSBuild:UpdateDesignTimeXaml @@ -1458,12 +1448,6 @@ - - - Designer - MSBuild:UpdateDesignTimeXaml - - diff --git a/src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.jpg b/src/Forms/Shared/Samples/Security/IntegratedWindowsAuth/IntegratedWindowsAuth.jpg deleted file mode 100644 index 92a7dc5003566408391a5aa01d0a3b251fd4fd18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57014 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