Skip to content

Integrated windows auth #370

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 41 commits into from
Aug 8, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
12b7240
patch-closest-facility-static-readme (#363)
JonLavi Jun 14, 2019
3d6d13b
delete sample calculate distance 3D (#365)
JonLavi Jun 18, 2019
61c2af9
Patch/ClosestFacilityStatic- Edit readme 'how to use' (#364)
JonLavi Jun 18, 2019
8a12999
patch oAuth sample custom challengehandler (#366)
JonLavi Jun 20, 2019
97a7461
working sample
JonLavi Jun 24, 2019
524f97e
comments, formatting, UI improvements
JonLavi Jun 24, 2019
cc63013
UI, screenshot, readme
JonLavi Jun 24, 2019
903c1ea
readme formatting
JonLavi Jun 24, 2019
684a10a
code formatting
JonLavi Jun 24, 2019
88b3c1f
ui improvements, screenshot
JonLavi Jun 25, 2019
111b897
comments, formatting
JonLavi Jun 25, 2019
223ca40
readme tags
JonLavi Jun 25, 2019
451c496
javadoc comments
JonLavi Jun 25, 2019
96e93c8
ui improvements
JonLavi Jun 28, 2019
8993206
ui improvements
JonLavi Jun 28, 2019
989e050
refactoring
JonLavi Jun 28, 2019
099942b
comments
JonLavi Jun 28, 2019
a48f046
address review suggestions
JonLavi Jul 3, 2019
b210e00
smaller UI
JonLavi Jul 3, 2019
48b8dc1
update screenshot
JonLavi Jul 3, 2019
4685d13
listview holds portal item ids
JonLavi Jul 3, 2019
863ea73
Update README.md, comments
JonLavi Jul 4, 2019
91e140b
update README.md
JonLavi Jul 4, 2019
d9139fa
rebase to split dev branch
JonLavi Jul 18, 2019
d287f06
fix package and path names
JonLavi Jul 18, 2019
ccb6737
delete irrelevant files
JonLavi Jul 18, 2019
9dd1f82
readme to MD
JonLavi Jul 18, 2019
3dbdd2a
add README.metadata.json
JonLavi Jul 26, 2019
e843f3f
updated README.metadata.json
JonLavi Jul 26, 2019
3ecb359
remove public search, refactoring
JonLavi Jul 26, 2019
3c44768
whitespace
JonLavi Jul 26, 2019
f29caf4
cell factory to class, fxml tidying
JonLavi Aug 6, 2019
9d96a7a
error handling, comments, refactoring
JonLavi Aug 6, 2019
bf13102
error handling
JonLavi Aug 6, 2019
0979f16
remove loading/portal info text
JonLavi Aug 6, 2019
3421276
class member to local var
JonLavi Aug 6, 2019
4b3bd3b
update Readme.md for UI changes and review suggestions
JonLavi Aug 7, 2019
7a38802
refactoring
JonLavi Aug 7, 2019
c7fec86
fix typo
JonLavi Aug 7, 2019
a5f9d43
Move construction of portal query parameters to its own line
tschie Aug 7, 2019
7e409e8
small UI improvements, update screenshot
JonLavi Aug 8, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
47 changes: 47 additions & 0 deletions portal/integrated_windows_authentication/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Integrated windows authentication

Use Windows credentials to access services hosted on a portal secured with Integrated Windows Authentication (IWA).

![](IntegratedWindowsAuthentication.png)

## Use case

IWA, which is built into Microsoft Internet Information Server (IIS), allows users to easily authenticate for different services using their domain's Windows credentials. This simplifies logging in to services that are provided through an intranet environment, as only a single username and password combination are required for the applications that support IWA.

## How to use the sample

Enter a URL to your IWA-secured portal into the URL field and select "Search IWA Secured Portal" to search for web maps stored there. Authenticate with a username (including domain, such as username@DOMAIN or domain\username), and password. If authentication is successful, portal item results will display in the list. Select a web map item to display it in the map view.

## How it works

1. Set up an `AuthenticationChallengeHandler` that challenges the user for authentication, such as the custom handler created for this sample: `IWAChallengeHandler`.
2. Set the `AuthenticationManager` to use the created challenge handler using `.setAuthenticationChallengeHandler(new IWAChallengeHandler());`.
3. Create a new `Portal` from a portal URL and a boolean indicating if it is a secured resource using `new Portal(url, true)`.
4. Load the portal. The authentication challenge handler will prompt the user for credentials. The portal will load successfully with valid credentials.
5. Create `PortalQueryParameters` to define a search query for map items in the portal.
5. Find web map portal items using `Portal.findItemsAsync(portalQueryParameters)`.
6. Create a map using a `PortalItem` result with `new ArcGISMap(portalItem)`.

## Relevant API

* AuthenticationChallenge
* AuthenticationChallengeHandler
* AuthenticationChallengeResponse
* AuthenticationManager
* Portal
* UserCredential

## About the data

Searching a public portal with this sample retrieves publicly available web maps from www.arcgis.com.

## Additional information

More information about IWA and its use with ArcGIS can be found at the following links:

* [Use Integrated Windows Authentication with your portal](http://enterprise.arcgis.com/en/portal/latest/administer/windows/use-integrated-windows-authentication-with-your-portal.htm)
* [IWA - Wikipedia](https://en.wikipedia.org/wiki/Integrated_Windows_Authentication)

## Tags

authentication, IWA, login, portal, security, sign-in
34 changes: 34 additions & 0 deletions portal/integrated_windows_authentication/README.metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"category": "Portal",
"description": "Use Windows credentials to access services hosted on a portal secured with Integrated Windows Authentication (IWA).",
"ignore": false,
"images": [
"IntegratedWindowsAuthentication.png"
],
"keywords": [
"authentication",
"IWA",
"login",
"portal",
"security",
"sign"
],
"redirect_from": "/java/latest/sample-code/integrated-windows-authentication.htm",
"relevant_apis": [
"AuthenticationChallenge",
"AuthenticationChallengeHandler",
"AuthenticationChallengeResponse",
"AuthenticationManager",
"Portal",
"UserCredential"
],
"snippets": [
"src/main/java/com/esri/samples/integrated_windows_authentication/AuthenticationDialog.java",
"src/main/java/com/esri/samples/integrated_windows_authentication/IntegratedWindowsAuthenticationController.java",
"src/main/java/com/esri/samples/integrated_windows_authentication/IntegratedWindowsAuthenticationSample.java",
"src/main/java/com/esri/samples/integrated_windows_authentication/IWAChallengeHandler.java",
"src/main/resources/iwa_auth_dialog.fxml",
"src/main/resources/iwa_controller.fxml"
],
"title": "Integrated windows authentication"
}
74 changes: 74 additions & 0 deletions portal/integrated_windows_authentication/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.5'
}

group = 'com.esri.samples'

ext {
arcgisVersion = '100.5.0'
}

javafx {
version = "11.0.1"
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.web' ]
}

compileJava.options.encoding = 'UTF-8'

repositories {
jcenter()
maven {
url 'https://esri.bintray.com/arcgis'
}
maven {
url 'http://olympus.esri.com/artifactory/arcgisruntime-repo'
}
}

configurations {
natives
}

dependencies {
compile "com.esri.arcgisruntime:arcgis-java:$arcgisVersion"
natives "com.esri.arcgisruntime:arcgis-java-jnilibs:$arcgisVersion"
natives "com.esri.arcgisruntime:arcgis-java-resources:$arcgisVersion"
}

task copyNatives(type: Copy) {
description = "Copies the arcgis native libraries into the project build directory for development."
group = "build"
configurations.natives.asFileTree.each {
from(zipTree(it))
}
// store native libraries in a common location shared with other samples
into "${System.properties.getProperty("user.home")}/.arcgis/$arcgisVersion"
}

run {
dependsOn copyNatives
mainClassName = 'com.esri.samples.integrated_windows_authentication.IntegratedWindowsAuthenticationLauncher'
}

jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
manifest {
attributes("Main-Class": "$mainClassName")
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}

task productionZip(type: Zip) {
group = 'distribution'
from copyNatives
from jar.destinationDir
into (project.name)
baseName = project.name
}

wrapper {
gradleVersion = '5.0'
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
172 changes: 172 additions & 0 deletions portal/integrated_windows_authentication/gradlew
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
#!/usr/bin/env sh

##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
echo "$*"
}

die () {
echo
echo "$*"
echo
exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`

# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option

if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi

# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"
Loading