<?xml version="1.0"?>
<doc>
    <assembly>
        <name>GSF.Security</name>
    </assembly>
    <members>
        <member name="M:GSF.Security.AzureADPassthroughPrincipal.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.AzureADPassthroughPrincipal" />
            class representing an Azure AD user with a passthrough principal.
            </summary>
            <param name="name">The name of the user on whose behalf the code is running.</param>
        </member>
        <member name="T:GSF.Security.AzureADSettings">
            <summary>
            Represents settings needed for Azure Active Directory (AD) authentication.
            </summary>
        </member>
        <member name="F:GSF.Security.AzureADSettings.DefaultSettingsCategory">
            <summary>
            Default category for Azure AD settings.
            </summary>
        </member>
        <member name="F:GSF.Security.AzureADSettings.DefaultInstance">
            <summary>
            Default value for <see cref="P:GSF.Security.AzureADSettings.Instance"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.AzureADSettings.DefaultTenantID">
            <summary>
            Default value for <see cref="P:GSF.Security.AzureADSettings.TenantID"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.AzureADSettings.DefaultClientID">
            <summary>
            Default value for <see cref="P:GSF.Security.AzureADSettings.ClientID"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.AzureADSettings.DefaultRedirectURI">
            <summary>
            Default value for <see cref="P:GSF.Security.AzureADSettings.RedirectURI"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.AzureADSettings.DefaultCallbackPath">
            <summary>
            Default value for <see cref="P:GSF.Security.AzureADSettings.CallbackPath"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.AzureADSettings.DefaultSignedOutCallbackPath">
            <summary>
            Default value for <see cref="P:GSF.Security.AzureADSettings.SignedOutCallbackPath"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.AzureADSettings.DefaultEnabled">
            <summary>
            Default value for <see cref="P:GSF.Security.AzureADSettings.Enabled"/> property.
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.Instance">
            <summary>
            Gets or sets the Azure AD instance URL.
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.TenantID">
            <summary>
            Gets or sets the Azure AD tenant ID.
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.ClientID">
            <summary>
            Gets or sets the Azure AD client ID.
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.RedirectURI">
            <summary>
            Gets or sets the redirect URI where authentication responses can be received by the application.
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.CallbackPath">
            <summary>
            Gets or sets the Azure AD call-back path.
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.SignedOutCallbackPath">
            <summary>
            Gets or sets the Azure AD signed out call-back path.
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.Enabled">
            <summary>
            Gets the flag that determines if Azure AD is enabled.
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.Authority">
            <summary>
            Gets the Azure AD authority (Instance + TenantID).
            </summary>
        </member>
        <member name="P:GSF.Security.AzureADSettings.LastException">
            <summary>
            Gets the last exception, if any, encountered after getting a new Graph service client.
            </summary>
        </member>
        <member name="M:GSF.Security.AzureADSettings.GetGraphClient(System.String,System.Boolean)">
            <summary>
            Gets a new Graph service client.
            </summary>
            <param name="settingsCategory">Settings category to use for determine configuration location.</param>
            <param name="forceRefresh">Set to <c>true</c> to force refresh of Azure AD token.</param>
            <returns>New Graph service client when Azure AD is enabled; otherwise, <c>null</c>.</returns>
        </member>
        <member name="M:GSF.Security.AzureADSettings.Load(System.String)">
            <summary>
            Loads Azure AD settings. Source based on target configuration.
            </summary>
            <param name="settingsCategory">Settings category to use for determine configuration location.</param>
            <returns>Loaded <see cref="T:GSF.Security.AzureADSettings"/> settings instance.</returns>
        </member>
        <member name="M:GSF.Security.AzureADSettings.LoadFromAppSettings(System.String)">
            <summary>
            Loads Azure AD settings from the specified JSON application settings file.
            </summary>
            <param name="filepath">JSON settings file to load. Defaults to local "appsettings.json".</param>
            <returns>Loaded <see cref="T:GSF.Security.AzureADSettings"/> settings instance.</returns>
        </member>
        <member name="M:GSF.Security.AzureADSettings.LoadFromConfig(System.String)">
            <summary>
            Loads Azure AD settings from categorized settings.
            </summary>
            <param name="settingsCategory">Settings category to use for settings load.</param>
            <returns>Loaded <see cref="T:GSF.Security.AzureADSettings"/> settings instance.</returns>
        </member>
        <member name="T:GSF.Security.TokenResponse">
            <summary>
            Defines a JSON token response for the <see cref="T:GSF.Security.OIDCSecurityProvider"/>.
            </summary>
        </member>
        <member name="P:GSF.Security.TokenResponse.access_token">
            <summary>
            Access token.
            </summary>
        </member>
        <member name="P:GSF.Security.TokenResponse.id_token">
            <summary>
            ID token.
            </summary>
        </member>
        <member name="T:GSF.Security.OIDCSecurityProvider">
            <summary>
            Represents an <see cref="T:GSF.Security.ISecurityProvider"/> that uses openID Connect
            </summary>
            <example>
            Required config file entries (automatically added):
            <code>
            <![CDATA[
            <?xml version="1.0"?>
            <configuration>
              <configSections>
                <section name="categorizedSettings" type="GSF.Configuration.CategorizedSettingsSection, GSF.Core" />
              </configSections>
              <categorizedSettings>
                <securityProvider>
                  <add name="ProviderType" value="GSF.Security.OIDCSecurityProvider, GSF.Security" description="The type to be used for enforcing security."
                    encrypted="false" />
                  <add name="ClientID" value="xxxx-xxxx-xxxx" description="Defines the ClientID as required per OpenID Connect Standard." encrypted="false" />
                  <add name="Scope" value="user" description="Defines the Scope as required per OpenID Connect Standard." encrypted="false" />
                  <add name="AuthorizationEndpoint" value="user" description="Defines the Endpoint to redirect the user for Authorization." encrypted="false" />
                  <add name="RedirectURI" value="https://localhost:8986/" description="Defines the URI the User get's redirected to after signing in." encrypted="false" />
                  <add name="ClientSecret" value="sssss-ssssss-sssss" description="Defines the Client Secret to encrypt User Information." encrypted="false" />
                  <add name="SelfVerifiedNonce="aefgdfhf" description="Defines the Client Secret to encrypt User Information." encrypted="false" />
                  <add name="TokenEndpoint" value="user" description="Defines the Endpoint to get the User Token from." encrypted="false" />
                  <add name="ShowDetailedError" value="true" description="Indicates if the Login Page should display detailed Debuging Information when OAuth Fails." encrypted="false" />
                </securityProvider>
              </categorizedSettings>
            </configuration>
            ]]>
            </code>
            </example>
        </member>
        <member name="F:GSF.Security.OIDCSecurityProvider.ProviderID">
            <summary>
            Defines the provider ID for the <see cref="T:GSF.Security.AdoSecurityProvider"/>.
            </summary>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.AdoSecurityProvider"/> class.
            </summary>
            <param name="username">Name that uniquely identifies the user.</param>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.UserData">
            <summary>
            Gets the <see cref="T:GSF.Security.OIDCUserData"/> object containing information about the user.
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.LastException">
            <summary>
            Gets last exception reported by the <see cref="T:GSF.Security.AdoSecurityProvider"/>.
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.UseDatabaseLogging">
            <summary>
            Gets or sets flag that determines if <see cref="M:GSF.Security.OIDCSecurityProvider.LogAuthenticationAttempt(System.Boolean)"/> and <see cref="M:GSF.Security.OIDCSecurityProvider.LogError(System.String,System.String)"/> should
            write to the database. Defaults to <c>true</c>.
            </summary>
            <remarks>
            Setting this flag to <c>false</c> may be necessary in cases where a database has been setup to use authentication
            but does not include an "AccessLog" or "ErrorLog" table.
            </remarks>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.ClientID">
            <summary>
            The ClienID used to identify this Application with the Authorization Server
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.Scope">
            <summary>
            The Scope used to obtain UserInformation from the Authorization Server
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.SelfVerifiedNonce">
            <summary>
            A Nonce that has been verified manually and never expires. This is used for allowing Server-server logons.
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.AuthorizationEndpoint">
            <summary>
            The Endpoint used to redirect the User
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.TokenEndpoint">
            <summary>
            The Endpoint to get the User Token
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.RedirectURI">
            <summary>
            The URI the User get's redirected to after signing in.
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.ClientSecret">
            <summary>
            The ClientSecret used to encrypt the user data
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.RolesClaim">
            <summary>
            The Claim used to get the Roles for the user
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.IsRedirectRequested">
            <summary>
            Gets the flag that indicates whether the user 
            needs to be redirected after the Authentication attempt. 
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.RequestedRedirect">
            <summary>
            Gets the URI that user will be redirected to if <see cref="P:GSF.Security.OIDCSecurityProvider.IsRedirectRequested"/> is set.
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.ShowDetailedError">
            <summary>
            Indicates if the Login Page should display detailed Debugging Information when OAuth Fails.
            </summary>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.LoadSettings">
            <summary>
            Loads saved security provider settings from the config file if the <see cref="P:GSF.Security.SecurityProviderBase.PersistSettings"/> property is set to true.
            </summary>
            <exception cref="T:System.Configuration.ConfigurationErrorsException"><see cref="P:GSF.Security.SecurityProviderBase.SettingsCategory"/> has a value of null or empty string.</exception>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.RefreshData">
            <summary>
            Not implemented by <see cref="T:GSF.Security.OIDCSecurityProvider"/>; always returns <c>false</c>.
            </summary>
            <returns>true if <see cref="P:GSF.Security.SecurityProviderBase.UserData"/> is refreshed, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.Authenticate">
            <summary>
            Authenticates the user.
            </summary>
            <returns>true if the user is authenticated, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.LogAuthenticationAttempt(System.Boolean)">
            <summary>
            Logs user authentication attempt.
            </summary>
            <param name="loginSuccess">true if user authentication was successful, otherwise false.</param>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.LogError(System.String,System.String)">
            <summary>
            Logs information about an encountered exception to the backend data store.
            </summary>
            <param name="source">Source of the exception.</param>
            <param name="message">Detailed description of the exception.</param>
            <returns>true if logging was successful, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.GetTokenAsync(System.String)">
            <summary>
            Exchange Authorization Code for a Token
            </summary>
            <param name="code"> The Authorization Code returned by the Auth Server</param>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.TranslateRedirect(System.String,System.Uri,System.String,System.String)">
            <summary>
            Performs a translation of the default login page to a different endpoint.
            </summary>
            <param name="loginUrl"> The URI of the login page specified in the AppSettings </param>
            <param name="uri"> The URI originally requested. </param>
            <param name="encodedPath"> The URI requested by the client </param>
            <param name="referrer"> The Referrer as specified in the request header </param>
            <returns> The URI to be redirected to</returns>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.ResetPassword(System.String)">
            <summary>
            Not implemented by <see cref="T:GSF.Security.OIDCSecurityProvider"/>; always returns <c>false</c>.
            </summary>
            <param name="securityAnswer">Answer to the user's security question.</param>
            <returns>true if the password is reset, otherwise false.</returns>
            <remarks></remarks>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.ChangePassword(System.String,System.String)">
            <summary>
            Not implemented by <see cref="T:GSF.Security.OIDCSecurityProvider"/>; always returns <c>false</c>.
            </summary>
            <param name="oldPassword">User's current password.</param>
            <param name="newPassword">User's new password.</param>
            <returns>true if the password is changed, otherwise false.</returns>
        </member>
        <member name="P:GSF.Security.OIDCSecurityProvider.CanRefreshData">
            <summary>
            Not implemented by <see cref="T:GSF.Security.OIDCSecurityProvider"/>; always returns <c>false</c>.
            </summary>
        </member>
        <member name="M:GSF.Security.OIDCSecurityProvider.RequestToken(System.String)">
            <summary>
            Obtains the Token from the OIDC Server using a code.
            </summary>
        </member>
        <member name="T:GSF.Security.AdoSecurityProvider">
            <summary>
            Represents an <see cref="T:GSF.Security.ISecurityProvider"/> that uses ADO.NET data source (SQL Server, MySQL, Oracle, etc.) for its
            back-end data store and authenticates internal users against Active Directory and external users against the database.
            </summary>
            <example>
            Required config file entries (automatically added):
            <code>
            <![CDATA[
            <?xml version="1.0"?>
            <configuration>
              <configSections>
                <section name="categorizedSettings" type="GSF.Configuration.CategorizedSettingsSection, GSF.Core" />
              </configSections>
              <categorizedSettings>
                <securityProvider>
                  <add name="ProviderType" value="GSF.Security.AdoSecurityProvider, GSF.Security" description="The type to be used for enforcing security."
                    encrypted="false" />
                  <add name="UserCacheTimeout" value="5" description="Defines the timeout, in whole minutes, for a user's provider cache. Any value less than 1 will cause cache reset every minute."
                    encrypted="false" />
                  <add name="ConnectionString" value="Eval(systemSettings.ConnectionString)" description="Configuration database connection string"
                    encrypted="false"/>
                  <add name="DataProviderString" value="Eval(systemSettings.DataProviderString)" description="Configuration database ADO.NET data provider assembly type creation string"
                    encrypted="false"/>    
                  <add name="LdapPath" value="" description="Specifies the LDAP path used to initialize the security provider."
                    encrypted="false" />
                  <add name="ApplicationName" value="SEC_APP" description="Name of the application being secured."
                    encrypted="false" />
                  <add name="IncludedResources" value="*=*" description="Semicolon delimited list of resources to be secured along with role names."
                    encrypted="false" />
                  <add name="ExcludedResources" value="" description="Semicolon delimited list of resources to be excluded from being secured."
                    encrypted="false" />    
                  <add name="NotificationSmtpServer" value="localhost" description="SMTP server to be used for sending out email notification messages."
                    encrypted="false" />
                  <add name="NotificationSenderEmail" value="sender@company.com" description="Email address of the sender of email notification messages." 
                    encrypted="false" />
                  <add name="CacheRetryDelayInterval" value="200" description="Wait interval, in milliseconds, before retrying load of user data cache."
                    encrypted="false"/>
                  <add name="CacheMaximumRetryAttempts" value="10" description="Maximum retry attempts allowed for loading user data cache."
                    encrypted="false"/>
                  <add name="EnableOfflineCaching" value="True" description="True to enable caching of user information for authentication in offline state, otherwise False."
                    encrypted="false"/>
                  <add name="PasswordRequirementsRegex" value="^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$" description="Regular expression used to validate new passwords for database users."
                    encrypted="false" />
                  <add name="PasswordRequirementsError" value="Invalid Password: Password must be at least 8 characters; must contain at least 1 number, 1 upper case letter, and 1 lower case letter" description="Error message to be displayed when new database user password fails regular expression test."
                    encrypted="false" />
                  <add name="DefaultRoles" value="Viewer" description="If set this is a list of Roles assigned to a user that has no defined Roles."
                    encrypted="false" />
                </securityProvider>
                <activeDirectory>
                  <add name="PrivilegedDomain" value="" description="Domain of privileged domain user account."
                    encrypted="false" />
                  <add name="PrivilegedUserName" value="" description="Username of privileged domain user account."
                    encrypted="false" />
                  <add name="PrivilegedPassword" value="" description="Password of privileged domain user account."
                    encrypted="true" />
                </activeDirectory>
              </categorizedSettings>
            </configuration>
            ]]>
            </code>
            </example>
            <remarks>
            Minimum expected table schema for ADO Security Provider:
            <code>
            <![CDATA[
            CREATE TABLE UserAccount
            (
                ID UNIQUEINDENTIFIER NOT NULL DEFAULT NEWID(),
                Name VARCHAR(200) NOT NULL,
                Password VARCHAR(200) DEFAULT NULL,
                FirstName VARCHAR(200) DEFAULT NULL,
                LastName VARCHAR(200) DEFAULT NULL,
                Phone VARCHAR(200) DEFAULT NULL,
                Email VARCHAR(200) DEFAULT NULL,
                LockedOut TINYINT NOT NULL DEFAULT 0,
                UseADAuthentication TINYINT NOT NULL DEFAULT 1,
                ChangePasswordOn DATETIME DEFAULT NULL,
                CONSTRAINT PK_UserAccount PRIMARY KEY (ID ASC),
                CONSTRAINT IX_UserAccount UNIQUE KEY (Name)
            );
            
            CREATE TABLE SecurityGroup
            (
                ID UNIQUEINDENTIFIER NOT NULL DEFAULT NEWID(),
                Name VARCHAR(200) NOT NULL,
                CONSTRAINT PK_SecurityGroup PRIMARY KEY (ID ASC),
                CONSTRAINT IX_SecurityGroup UNIQUE KEY (Name)
            );
            
            CREATE TABLE SecurityGroupUserAccount
            (
                SecurityGroupID UNIQUEINDENTIFIER NOT NULL,
                UserAccountID UNIQUEINDENTIFIER NOT NULL
            );
            
            CREATE TABLE ApplicationRole
            (
                ID UNIQUEINDENTIFIER NOT NULL DEFAULT NEWID(),
                Name VARCHAR(200) NOT NULL,
                NodeID UNIQUEINDENTIFIER NOT NULL,
                CONSTRAINT PK_ApplicationRole PRIMARY KEY (ID ASC),
                CONSTRAINT IX_ApplicationRole UNIQUE KEY (NodeID, Name)
            );
            
            CREATE TABLE ApplicationRoleUserAccount
            (
                ApplicationRoleID UNIQUEINDENTIFIER NOT NULL,
                UserAccountID UNIQUEINDENTIFIER NOT NULL  
            );
            
            CREATE TABLE ApplicationRoleSecurityGroup
            (
                ApplicationRoleID UNIQUEINDENTIFIER NOT NULL,
                SecurityGroupID UNIQUEINDENTIFIER NOT NULL  
            );
            ]]>
            </code>
            </remarks>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultDefaultRoles">
            <summary>
            Default Roles to be used if no Roles are supplied for a user.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultPasswordRequirementsRegex">
            <summary>
            Default regular expression used to validate new database user passwords.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultPasswordRequirementsError">
            <summary>
            Default error message displayed when databases users fail regular expression test.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultUseDatabaseLogging">
            <summary>
            Default value for <see cref="P:GSF.Security.AdoSecurityProvider.UseDatabaseLogging"/>.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultMessageUserNotDefined">
            <summary>
            Default message displayed when user is not defined.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultMessageUserIsDisabled">
            <summary>
            Default message displayed when user is disabled.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultMessageUserIsLockedOut">
            <summary>
            Default message displayed when user is locked out.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultMessageUserPasswordExpired">
            <summary>
            Default message displayed when password is expired or has not been set.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultMessageUserHasNoRoles">
            <summary>
            Default message displayed when user is not a member of any roles.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.ProviderID">
            <summary>
            Defines the provider ID for the <see cref="T:GSF.Security.AdoSecurityProvider"/>.
            </summary>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.AdoSecurityProvider"/> class.
            </summary>
            <param name="username">Name that uniquely identifies the user.</param>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.#ctor(System.String,System.Boolean,System.Boolean,System.Boolean)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.AdoSecurityProvider"/> class.
            </summary>
            <param name="username">Name that uniquely identifies the user.</param>
            <param name="canRefreshData">true if the security provider can refresh <see cref="T:GSF.Security.UserData"/> from the back-end data store, otherwise false.</param>
            <param name="canResetPassword">true if the security provider can reset user password, otherwise false.</param>
            <param name="canChangePassword">true if the security provider can change user password, otherwise false.</param>
        </member>
        <member name="P:GSF.Security.AdoSecurityProvider.LastException">
            <summary>
            Gets last exception reported by the <see cref="T:GSF.Security.AdoSecurityProvider"/>.
            </summary>
        </member>
        <member name="P:GSF.Security.AdoSecurityProvider.UseDatabaseLogging">
            <summary>
            Gets or sets flag that determines if <see cref="M:GSF.Security.AdoSecurityProvider.LogAuthenticationAttempt(System.Boolean)"/> and <see cref="M:GSF.Security.AdoSecurityProvider.LogError(System.String,System.String)"/> should
            write to the database. Defaults to <c>true</c>.
            </summary>
            <remarks>
            Setting this flag to <c>false</c> may be necessary in cases where a database has been setup to use authentication
            but does not include an "AccessLog" or "ErrorLog" table.
            </remarks>
        </member>
        <member name="P:GSF.Security.AdoSecurityProvider.DefaultRoles">
            <summary>
            Gets or sets the Default Roles used when a user does not have a role defined.
            The user still needs to exist but they won't require a Role and will be assigned the DefaultRoles.
            It is a comma separate list for multiple Roles. If an empty String is supplied a Role is required for the user.
            </summary>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.LoadSettings">
            <summary>
            Loads saved security provider settings from the config file if the <see cref="P:GSF.Security.SecurityProviderBase.PersistSettings"/> property is set to true.
            </summary>
            <exception cref="T:System.Configuration.ConfigurationErrorsException"><see cref="P:GSF.Security.SecurityProviderBase.SettingsCategory"/> has a value of null or empty string.</exception>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.RefreshData">
            <summary>
            Refreshes the <see cref="T:GSF.Security.UserData"/>.
            </summary>
            <returns>true if <see cref="P:GSF.Security.SecurityProviderBase.UserData"/> is refreshed, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.Authenticate">
            <summary>
            Authenticates the user.
            </summary>
            <returns>true if the user is authenticated, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.ChangePassword(System.String,System.String)">
            <summary>
            Changes user password in the backend data store.
            </summary>
            <param name="oldPassword">User's current password.</param>
            <param name="newPassword">User's new password.</param>
            <returns>true if the password is changed, otherwise false.</returns>
            <exception cref="T:System.Security.SecurityException"><paramref name="newPassword"/> does not meet password requirements.</exception>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.LogAuthenticationAttempt(System.Boolean)">
            <summary>
            Logs user authentication attempt.
            </summary>
            <param name="loginSuccess">true if user authentication was successful, otherwise false.</param>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.LogError(System.String,System.String)">
            <summary>
            Logs information about an encountered exception to the backend data store.
            </summary>
            <param name="source">Source of the exception.</param>
            <param name="message">Detailed description of the exception.</param>
            <returns>true if logging was successful, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.GetLdapPath">
            <summary>
            Gets the LDAP path.
            </summary>
            <returns>The LDAP path.</returns>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.GetUserRoles(System.String)">
            <summary>
            Gets a list of roles for this user for a specified application ID, i.e., target node ID.
            </summary>
            <param name="applicationId">The node ID for the roles to be returned.</param>
            <returns>The roles that the specified user has.</returns>
        </member>
        <member name="E:GSF.Security.AdoSecurityProvider.SecurityContextRefreshed">
            <summary>
            Raised when the security context is refreshed.
            </summary>
        </member>
        <member name="F:GSF.Security.AdoSecurityProvider.DefaultNodeID">
            <summary>
            Gets current default Node ID for security.
            </summary>
        </member>
        <member name="M:GSF.Security.AdoSecurityProvider.ExtractSecurityContext(System.Data.IDbConnection,System.Action{System.Exception},System.String)">
            <summary>
            Extracts the current security context from the database.
            </summary>
            <param name="connection">Existing database connection used to extract security context.</param>
            <param name="exceptionHandler">Exception handler to use for any exceptions encountered while updating security cache.</param>
            <param name="currentUserName">Current user name, if applicable in calling context.</param>
            <returns>A new <see cref="T:System.Data.DataSet"/> containing the latest security context.</returns>
        </member>
        <member name="T:GSF.Security.AdoSecurityCache">
            <summary>
            Represents a secured inter-process cache for the security context needed by the <see cref="T:GSF.Security.AdoSecurityProvider"/>.
            </summary>
            <remarks>
            This is a system cache that contains the last known security information loaded from the database related to users,
            roles and groups. This cache allows the <see cref="T:GSF.Security.AdoSecurityProvider"/> to start-up without database access
            using latest cached security context. Even though this cache contains role information for all users, it does
            not overlap information in the <see cref="T:GSF.Security.UserRoleCache"/> since the user role cache contains role assignments
            for a user at last login and is used for auditing.
            </remarks>
        </member>
        <member name="M:GSF.Security.AdoSecurityCache.#ctor(System.Int32)">
            <summary>
            Creates a new instance of the <see cref="T:GSF.Security.AdoSecurityCache"/> with the specified number of <paramref name="maximumConcurrentLocks"/>.
            </summary>
            <param name="maximumConcurrentLocks">Maximum concurrent reader locks to allow.</param>
        </member>
        <member name="P:GSF.Security.AdoSecurityCache.DataSet">
            <summary>
            Gets or sets the internal <see cref="P:GSF.Security.AdoSecurityCache.DataSet"/>; returned value will be a copy of the internal.
            </summary>
        </member>
        <member name="M:GSF.Security.AdoSecurityCache.Save">
            <summary>
            Initiates inter-process synchronized save of <see cref="P:GSF.Security.AdoSecurityCache.DataSet"/>.
            </summary>
        </member>
        <member name="M:GSF.Security.AdoSecurityCache.SaveFileData(System.IO.FileStream,System.Byte[])">
            <summary>
            Handles serialization of file to disk; virtual method allows customization (e.g., pre-save encryption and/or data merge).
            </summary>
            <param name="fileStream"><see cref="T:System.IO.FileStream"/> used to serialize data.</param>
            <param name="fileData">File data to be serialized.</param>
            <remarks>
            Consumers overriding this method should not directly call <see cref="P:GSF.IO.InterprocessCache.FileData"/> property to avoid potential dead-locks.
            </remarks>
        </member>
        <member name="M:GSF.Security.AdoSecurityCache.LoadFileData(System.IO.FileStream)">
            <summary>
            Handles deserialization of file from disk; virtual method allows customization (e.g., pre-load decryption and/or data merge).
            </summary>
            <param name="fileStream"><see cref="T:System.IO.FileStream"/> used to deserialize data.</param>
            <returns>Deserialized file data.</returns>
            <remarks>
            Consumers overriding this method should not directly call <see cref="P:GSF.IO.InterprocessCache.FileData"/> property to avoid potential dead-locks.
            </remarks>
        </member>
        <member name="M:GSF.Security.AdoSecurityCache.GetCurrentCache">
            <summary>
            Loads the <see cref="T:GSF.Security.AdoSecurityCache"/> for the current local user.
            </summary>
            <returns>Loaded instance of the <see cref="T:GSF.Security.AdoSecurityCache"/>.</returns>
        </member>
        <member name="T:GSF.Security.Model.AccessLog">
            <summary>
            Model for AccessLog table.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.AccessLog.ID">
            <summary>
            Unique ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.AccessLog.UserName">
            <summary>
            User name field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.AccessLog.AccessGranted">
            <summary>
            Access granted flag field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.AccessLog.NodeID">
            <summary>
            Node ID of the Application.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.AccessLog.CreatedOn">
            <summary>
            Created on field.
            </summary>
        </member>
        <member name="T:GSF.Security.Model.ErrorLog">
            <summary>
            Model for ErrorLog table.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ErrorLog.ID">
            <summary>
            Unique ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ErrorLog.Source">
            <summary>
            Source field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ErrorLog.Type">
            <summary>
            Type field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ErrorLog.Message">
            <summary>
            Message field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ErrorLog.Detail">
            <summary>
            Detail field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ErrorLog.CreatedOn">
            <summary>
            Created on field.
            </summary>
        </member>
        <member name="T:GSF.Security.Model.ApplicationRole">
            <summary>
            Model for ApplicationRole table.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRole.ID">
            <summary>
            Unique application role ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRole.Name">
            <summary>
            Name field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRole.Description">
            <summary>
            Description field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRole.NodeID">
            <summary>
            Node ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRole.CreatedOn">
            <summary>
            Created on field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRole.CreatedBy">
            <summary>
            Created by field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRole.UpdatedOn">
            <summary>
            Updated on field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRole.UpdatedBy">
            <summary>
            Updated by field.
            </summary>
        </member>
        <member name="T:GSF.Security.Model.ApplicationRoleSecurityGroup">
            <summary>
            Model for ApplicationRoleSecurityGroup table.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRoleSecurityGroup.ApplicationRoleID">
            <summary>
            Application role ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRoleSecurityGroup.SecurityGroupID">
            <summary>
            Security group ID field.
            </summary>
        </member>
        <member name="T:GSF.Security.Model.SecurityGroupUserAccount">
            <summary>
            Model for SecurityGroupUserAccount table.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroupUserAccount.SecurityGroupID">
            <summary>
            Security group ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroupUserAccount.UserAccountID">
            <summary>
            User account ID field.
            </summary>
        </member>
        <member name="T:GSF.Security.Model.ApplicationRoleUserAccount">
            <summary>
            Model for ApplicationRoleUserAccount table.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRoleUserAccount.ApplicationRoleID">
            <summary>
            Application role ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.ApplicationRoleUserAccount.UserAccountID">
            <summary>
            User account ID field.
            </summary>
        </member>
        <member name="T:GSF.Security.Model.Node">
            <summary>
            Model for Node table.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.ID">
            <summary>
            Unique node ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.Name">
            <summary>
            Name field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.CompanyID">
            <summary>
            Company ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.Longitude">
            <summary>
            Longitude field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.Latitude">
            <summary>
            Latitude field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.Description">
            <summary>
            Description field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.ImagePath">
            <summary>
            Image path field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.Settings">
            <summary>
            Settings field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.MenuType">
            <summary>
            Menu type field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.MenuData">
            <summary>
            Description field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.Master">
            <summary>
            Master field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.LoadOrder">
            <summary>
            Load order field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.Enabled">
            <summary>
            Enabled field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.CreatedOn">
            <summary>
            Created on field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.CreatedBy">
            <summary>
            Created by field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.UpdatedOn">
            <summary>
            Updated on field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.Node.UpdatedBy">
            <summary>
            Updated by field.
            </summary>
        </member>
        <member name="T:GSF.Security.Model.SecurityGroup">
            <summary>
            Model for SecurityGroup table.
            </summary>
            <remarks>
            A record in this table can represent a database defined group with associated users
            or an Active Directory group that maintains its own users.
            </remarks>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroup.ID">
            <summary>
            Unique security group ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroup.Name">
            <summary>
            Group name field - stores SID for AD authentication.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroup.Description">
            <summary>
            Description field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroup.CreatedOn">
            <summary>
            Created on field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroup.CreatedBy">
            <summary>
            Created by field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroup.UpdatedOn">
            <summary>
            Updated on field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroup.UpdatedBy">
            <summary>
            Updated by field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.SecurityGroup.AccountName">
            <summary>
            Group account name, converted from security ID as needed.
            </summary>
        </member>
        <member name="T:GSF.Security.Model.UserAccount">
            <summary>
            Model for UserAccount table.
            </summary>
            <remarks>
            A record in this table can represent a database defined user with associated detail
            or an Active Directory user that maintains its own user details.
            </remarks>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.ID">
            <summary>
            Unique user account ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.Name">
            <summary>
            User name field - stores SID for AD authentication.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.Password">
            <summary>
            Password field - stores password hash for DB authentication only.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.FirstName">
            <summary>
            First name field - for DB authentication only.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.LastName">
            <summary>
            Last name field - for DB authentication only.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.DefaultNodeID">
            <summary>
            Default Node ID field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.Phone">
            <summary>
            Phone number field - for DB authentication only.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.Email">
            <summary>
            E-mail field - for DB authentication only.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.ChangePasswordOn">
            <summary>
            Change password on date field - for DB authentication only.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.UseADAuthentication">
            <summary>
            Use Active Directory authentication field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.LockedOut">
            <summary>
            User locked-out field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.CreatedOn">
            <summary>
            Created on field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.CreatedBy">
            <summary>
            Created by field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.UpdatedOn">
            <summary>
            Updated on field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.UpdatedBy">
            <summary>
            Updated by field.
            </summary>
        </member>
        <member name="P:GSF.Security.Model.UserAccount.AccountName">
            <summary>
            User account name, converted from security ID as needed.
            </summary>
        </member>
        <member name="T:GSF.Security.OIDCUserData">
            <summary>
            Defines <see cref="T:GSF.Security.UserData"/> for the <see cref="T:GSF.Security.OIDCSecurityProvider"/>.
            </summary>
        </member>
        <member name="M:GSF.Security.OIDCUserData.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.OIDCUserData"/> class.
            </summary>
        </member>
        <member name="M:GSF.Security.OIDCUserData.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.OIDCUserData"/> class.
            </summary>
            <param name="username">User's logon name.</param>
        </member>
        <member name="P:GSF.Security.OIDCUserData.Nonce">
            <summary>
            Gets or sets OIDC Nonce value associated with this user.
            </summary>
        </member>
        <member name="P:GSF.Security.OIDCUserData.Token">
            <summary>
            Gets or sets the <see cref="T:GSF.Security.TokenResponse"/> associated with this user.
            </summary>
        </member>
        <member name="T:GSF.Security.TokenCacheHelper">
            <summary>
            Defines a helper class for token cache management.
            </summary>
        </member>
        <member name="P:GSF.Security.TokenCacheHelper.CacheFilePath">
            <summary>
            Path to the token cache.
            </summary>
        </member>
        <member name="T:GSF.Security.UserRoleCache">
            <summary>
            Represents a secured inter-process cache for a <see cref="T:System.Collections.Generic.Dictionary`2"/> of serialized user role information.
            </summary>
            <remarks>
            This is a system cache that contains the role assignments for each user that has logged in successfully. This cache is used
            to check for changes in role assignments for a user - that is, a role change in the database that may now be different than
            what is in the current cache. Any kind of role changes are logged as security events in the Windows event log for auditing.
            Note that this is kept as a separate cache from the <see cref="T:GSF.Security.AdoSecurityCache"/> since the user role cache is used for
            auditing and contains information relative to a user's roles at last login.
            </remarks>
        </member>
        <member name="M:GSF.Security.UserRoleCache.#ctor(System.Int32)">
            <summary>
            Creates a new instance of the <see cref="T:GSF.Security.UserRoleCache"/> with the specified number of <paramref name="maximumConcurrentLocks"/>.
            </summary>
            <param name="maximumConcurrentLocks">Maximum concurrent reader locks to allow.</param>
        </member>
        <member name="P:GSF.Security.UserRoleCache.UserRoles">
            <summary>
            Gets a copy of the internal user role dictionary.
            </summary>
        </member>
        <member name="P:GSF.Security.UserRoleCache.Item(System.String)">
            <summary>
            Gets or sets access roles for given <paramref name="userName"/>.
            </summary>
            <param name="userName">User name for associated access role to load or save.</param>
            <returns>Access roles for given <paramref name="userName"/> if found; otherwise <c>null</c>.</returns>
        </member>
        <member name="M:GSF.Security.UserRoleCache.TryGetUserRole(System.String,System.String[]@)">
            <summary>
            Attempts to retrieve access role for given <paramref name="userName"/>.
            </summary>
            <param name="userName">User name associated with access role to retrieve.</param>
            <param name="roles">Access roles to populate if found.</param>
            <returns><c>true</c> if access roles for given <paramref name="userName"/> were retrieved; otherwise <c>false</c>.</returns>
        </member>
        <member name="M:GSF.Security.UserRoleCache.SaveUserRole(System.String,System.String[])">
            <summary>
            Serializes the <paramref name="roles"/> for the given <paramref name="userName"/> into the <see cref="T:GSF.Security.UserRoleCache"/>.
            </summary>
            <param name="userName">User name associated with access role to retrieve.</param>
            <param name="roles">Access roles to update or populate.</param>
            <remarks>
            <para>
            This will add an entry into the user roles cache for <paramref name="userName"/> if it doesn't exist;
            otherwise existing entry will be updated.
            </para>
            <para>
            Updates are automatically queued up for serialization so user does not need to call <see cref="M:GSF.Security.UserRoleCache.Save"/>.
            </para>
            </remarks>
        </member>
        <member name="M:GSF.Security.UserRoleCache.MergeLeft(GSF.Security.UserRoleCache)">
            <summary>
            Merge user roles from another <see cref="T:GSF.Security.UserRoleCache"/>, local cache taking precedence.
            </summary>
            <param name="other">Other <see cref="T:GSF.Security.UserRoleCache"/> to merge with.</param>
        </member>
        <member name="M:GSF.Security.UserRoleCache.MergeRight(GSF.Security.UserRoleCache)">
            <summary>
            Merge user roles from another <see cref="T:GSF.Security.UserRoleCache"/>, other cache taking precedence.
            </summary>
            <param name="other">Other <see cref="T:GSF.Security.UserRoleCache"/> to merge with.</param>
        </member>
        <member name="M:GSF.Security.UserRoleCache.Save">
            <summary>
            Initiates inter-process synchronized save of user role cache.
            </summary>
        </member>
        <member name="M:GSF.Security.UserRoleCache.SaveFileData(System.IO.FileStream,System.Byte[])">
            <summary>
            Handles serialization of file to disk; virtual method allows customization (e.g., pre-save encryption and/or data merge).
            </summary>
            <param name="fileStream"><see cref="T:System.IO.FileStream"/> used to serialize data.</param>
            <param name="fileData">File data to be serialized.</param>
            <remarks>
            Consumers overriding this method should not directly call <see cref="P:GSF.IO.InterprocessCache.FileData"/> property to avoid potential dead-locks.
            </remarks>
        </member>
        <member name="M:GSF.Security.UserRoleCache.LoadFileData(System.IO.FileStream)">
            <summary>
            Handles deserialization of file from disk; virtual method allows customization (e.g., pre-load decryption and/or data merge).
            </summary>
            <param name="fileStream"><see cref="T:System.IO.FileStream"/> used to deserialize data.</param>
            <returns>Deserialized file data.</returns>
            <remarks>
            Consumers overriding this method should not directly call <see cref="P:GSF.IO.InterprocessCache.FileData"/> property to avoid potential dead-locks.
            </remarks>
        </member>
        <member name="M:GSF.Security.UserRoleCache.HashLoginID(System.String)">
            <summary>
            Calculates the hash of the <paramref name="userName"/> used as the key for the user roles dictionary.
            </summary>
            <param name="userName">User name to hash.</param>
            <returns>The Base64 encoded calculated SHA-2 hash of the <paramref name="userName"/> used as the key for the user roles dictionary.</returns>
            <remarks>
            For added security, a hash of the <paramref name="userName"/> is used as the key for accessing roles
            in the user roles cache instead of the actual <paramref name="userName"/>. This method allows the
            consumer to properly calculate this hash when directly using the user data cache.
            </remarks>
        </member>
        <member name="M:GSF.Security.UserRoleCache.GetCurrentCache">
            <summary>
            Loads the <see cref="T:GSF.Security.UserRoleCache"/> for the current local user.
            </summary>
            <returns>Loaded instance of the <see cref="T:GSF.Security.UserRoleCache"/>.</returns>
        </member>
        <member name="T:GSF.Security.LdapSecurityProvider">
            <summary>
            Represents an <see cref="T:GSF.Security.ISecurityProvider"/> that uses Active Directory for its backend data store and credential authentication.
            </summary>
            <remarks>
            A <a href="http://en.wikipedia.org/wiki/Security_Identifier" target="_blank">Security Identifier</a> can also be specified in 
            <b>IncludedResources</b> instead of a role name in the format of 'SID:&lt;Security Identifier&gt;' (Example: SID:S-1-5-21-19610888-1443184010-1631745340-269783).
            </remarks>
            <example>
            Required config file entries:
            <code>
            <![CDATA[
            <?xml version="1.0"?>
            <configuration>
              <configSections>
                <section name="categorizedSettings" type="GSF.Configuration.CategorizedSettingsSection, GSF.Core" />
              </configSections>
              <categorizedSettings>
                <securityProvider>
                  <add name="ApplicationName" value="" description="Name of the application being secured as defined in the backend security datastore."
                    encrypted="false" />
                  <add name="ConnectionString" value="LDAP://DC=COMPANY,DC=COM" description="Connection string to be used for connection to the backend security data store."
                    encrypted="false" />
                  <add name="ProviderType" value="GSF.Security.LdapSecurityProvider, GSF.Security" description="The type to be used for enforcing security."
                    encrypted="false" />
                  <add name="UserCacheTimeout" value="5" description="Defines the timeout, in whole minutes, for a user's provider cache. Any value less than 1 will cause cache reset every minute."
                    encrypted="false" />
                  <add name="IncludedResources" value="*=*" description="Semicolon delimited list of resources to be secured along with role names."
                    encrypted="false" />
                  <add name="ExcludedResources" value="" description="Semicolon delimited list of resources to be excluded from being secured."
                    encrypted="false" />
                  <add name="NotificationSmtpServer" value="localhost" description="SMTP server to be used for sending out email notification messages."
                    encrypted="false" />
                  <add name="NotificationSenderEmail" value="sender@company.com" description="Email address of the sender of email notification messages." 
                    encrypted="false" />
                  <add name="EnableOfflineCaching" value="True" description="True to enable caching of user information for authentication in offline state, otherwise False."
                    encrypted="false" />
                  <add name="CacheRetryDelayInterval" value="200" description="Wait interval, in milliseconds, before retrying load of user data cache."
                    encrypted="false" />
                  <add name="CacheMaximumRetryAttempts" value="10" description="Maximum retry attempts allowed for loading user data cache."
                    encrypted="false" />
                </securityProvider>
                <activeDirectory>
                  <add name="PrivilegedDomain" value="" description="Domain of privileged domain user account."
                    encrypted="false" />
                  <add name="PrivilegedUserName" value="" description="Username of privileged domain user account."
                    encrypted="false" />
                  <add name="PrivilegedPassword" value="" description="Password of privileged domain user account."
                    encrypted="true" />
                </activeDirectory>
              </categorizedSettings>
            </configuration>
            ]]>
            </code>
            </example>
        </member>
        <member name="F:GSF.Security.LdapSecurityProvider.ProviderID">
            <summary>
            Defines the provider ID for the <see cref="T:GSF.Security.LdapSecurityProvider"/>.
            </summary>
        </member>
        <member name="F:GSF.Security.LdapSecurityProvider.DefaultEnableOfflineCaching">
            <summary>
            Specifies the default value for the <see cref="P:GSF.Security.LdapSecurityProvider.EnableOfflineCaching"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.LdapSecurityProvider.DefaultCacheRetryDelayInterval">
            <summary>
            Specifies the default value for the <see cref="P:GSF.Security.LdapSecurityProvider.CacheRetryDelayInterval"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.LdapSecurityProvider.DefaultCacheMaximumRetryAttempts">
            <summary>
            Specifies the default value for the <see cref="P:GSF.Security.LdapSecurityProvider.CacheMaximumRetryAttempts"/> property.
            </summary>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.LdapSecurityProvider"/> class.
            </summary>
            <param name="username">Name that uniquely identifies the user.</param>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.#ctor(System.String,System.Boolean,System.Boolean,System.Boolean)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.LdapSecurityProvider"/> class.
            </summary>
            <param name="username">Name that uniquely identifies the user.</param>
            <param name="canRefreshData">true if the security provider can refresh <see cref="T:GSF.Security.UserData"/> from the backend data store, otherwise false.</param>
            <param name="canResetPassword">true if the security provider can reset user password, otherwise false.</param>
            <param name="canChangePassword">true if the security provider can change user password, otherwise false.</param>
        </member>
        <member name="P:GSF.Security.LdapSecurityProvider.EnableOfflineCaching">
            <summary>
            Gets or sets a boolean value that indicates whether user information is to be cached for offline authentication.
            </summary>
        </member>
        <member name="P:GSF.Security.LdapSecurityProvider.CacheRetryDelayInterval">
            <summary>
            Gets or sets the wait interval (in milliseconds) before retrying load of offline user data cache.
            </summary>
        </member>
        <member name="P:GSF.Security.LdapSecurityProvider.CacheMaximumRetryAttempts">
            <summary>
            Gets or sets the maximum retry attempts allowed for loading offline user data cache.
            </summary>
        </member>
        <member name="P:GSF.Security.LdapSecurityProvider.WindowsPrincipal">
            <summary>
            Gets the original <see cref="P:GSF.Security.LdapSecurityProvider.WindowsPrincipal"/> of the user if the user exists in Active Directory.
            </summary>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.ResetPassword(System.String)">
            <summary>
            Resets user password in the backend data store.
            </summary>
            <param name="securityAnswer">Answer to the user's security question.</param>
            <returns>true if the password is reset, otherwise false.</returns>
            <exception cref="T:System.NotSupportedException">Always</exception>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.SaveSettings">
            <summary>
            Saves <see cref="T:GSF.Security.LdapSecurityProvider"/> settings to the config file if the <see cref="P:GSF.Security.SecurityProviderBase.PersistSettings"/> property is set to true.
            </summary>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.LoadSettings">
            <summary>
            Loads saved <see cref="T:GSF.Security.LdapSecurityProvider"/> settings from the config file if the <see cref="P:GSF.Security.SecurityProviderBase.PersistSettings"/> property is set to true.
            </summary>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.Authenticate">
            <summary>
            Authenticates the user.
            </summary>
            <returns>true if the user is authenticated, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.RefreshData">
            <summary>
            Refreshes the <see cref="T:GSF.Security.UserData"/> from the backend data store.
            </summary>
            <returns>true if <see cref="P:GSF.Security.SecurityProviderBase.UserData"/> is refreshed, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.RefreshData(GSF.Security.UserData,System.Collections.Generic.List{System.String},System.Int32)">
            <summary>
            Refreshes the <see cref="T:GSF.Security.UserData"/> from the backend data store loading user groups into desired collection.
            </summary>
            <param name="userData">The structure for the data being refreshed.</param>
            <param name="groupCollection">Target collection for user groups.</param>
            <param name="providerID">Unique provider ID used to distinguish cached user data that may be different based on provider.</param>
            <returns>true if <see cref="P:GSF.Security.SecurityProviderBase.UserData"/> is refreshed, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.ChangePassword(System.String,System.String)">
            <summary>
            Changes user password in the backend data store.
            </summary>
            <param name="oldPassword">User's current password.</param>
            <param name="newPassword">User's new password.</param>
            <returns>true if the password is changed, otherwise false.</returns>
            <remarks>
            This method always returns <c>false</c> under Mono deployments.
            </remarks>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.TranslateRole(System.String)">
            <summary>
            Performs a translation of the specified user <paramref name="role"/>.
            </summary>
            <param name="role">The user role to be translated.</param>
            <returns>The user role that the specified user <paramref name="role"/> translates to.</returns>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.GetLdapPath">
            <summary>
            Gets the LDAP path.
            </summary>
            <returns>The LDAP path.</returns>
        </member>
        <member name="M:GSF.Security.LdapSecurityProvider.GetUserRoles(System.String)">
            <summary>
            Gets a list of Roles for this user for a specified ApplicationId.
            </summary>
            <param name="applicationId">The applicationId for the roles to be returned.</param>
            <returns>The roles that the specified user has.</returns>
        </member>
        <member name="T:GSF.Security.RestrictAccessAttribute">
            <summary>
            Represents an <see cref="T:System.Attribute"/> that can be used restrict access to a class when using role-based security.
            </summary>
        </member>
        <member name="M:GSF.Security.RestrictAccessAttribute.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.RestrictAccessAttribute"/> class.
            </summary>
        </member>
        <member name="M:GSF.Security.RestrictAccessAttribute.#ctor(System.String[])">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.RestrictAccessAttribute"/> class.
            </summary>
            <param name="roles">List of either roles the current thread principal must have in order to have access.</param>
        </member>
        <member name="P:GSF.Security.RestrictAccessAttribute.Roles">
            <summary>
            Gets or sets the list of either roles the current thread principal must have in order to have access.
            </summary>
        </member>
        <member name="M:GSF.Security.RestrictAccessAttribute.CheckAccess">
            <summary>
            Checks if the current thread principal has at least one of the <see cref="P:GSF.Security.RestrictAccessAttribute.Roles"/> in order to have access.
            </summary>
            <returns>true if the current thread principal has access, otherwise false.</returns>
        </member>
        <member name="T:GSF.Security.LogEventFunctionSignature">
            <summary>
            Defines the function signature delegate used for logging events from the <see cref="T:GSF.Security.ISecurityProvider"/>.
            </summary>
            <param name="source">The source by which the application is registered on the specified computer.</param>
            <param name="message">The string to write to the event log.</param>
            <param name="type">One of the <see cref="T:System.Diagnostics.EventLogEntryType"/> values.</param>
            <param name="eventID">The application-specific identifier for the event.</param>
        </member>
        <member name="T:GSF.Security.ISecurityProvider">
            <summary>
            Defines a provider of role-based security in applications.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.ApplicationName">
            <summary>
            Gets or sets the name of the application being secured as defined in the backend security data store.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.ConnectionString">
            <summary>
            Gets or sets the connection string to be used for connection to the backend security data store.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.PassthroughPrincipal">
            <summary>
            Gets or sets the principal used for passthrough authentication.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.SecurePassword">
            <summary>
            Gets or sets the password as a <see cref="T:System.Security.SecureString"/>.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.Password">
            <summary>
            Gets or sets <see cref="P:GSF.Security.ISecurityProvider.SecurePassword"/> as clear text password.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.UserData">
            <summary>
            Gets the <see cref="P:GSF.Security.ISecurityProvider.UserData"/> object containing information about the user.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.IsUserAuthenticated">
            <summary>
            Gets the flag that indicates whether the user was
            authenticated during the last authentication attempt.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.IsRedirectRequested">
            <summary>
            Gets the flag that indicates whether the user 
            needs to be redirected after the Authentication attempt. 
            Could be used for asking Users to confirm Messages etc.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.RequestedRedirect">
            <summary>
            Gets the URI that user will be redirected to if <see cref="P:GSF.Security.ISecurityProvider.IsRedirectRequested"/> is set.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.CanRefreshData">
            <summary>
            Gets a boolean value that indicates whether <see cref="M:GSF.Security.ISecurityProvider.RefreshData"/> operation is supported.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.CanResetPassword">
            <summary>
            Gets a boolean value that indicates whether <see cref="M:GSF.Security.ISecurityProvider.ResetPassword(System.String)"/> operation is supported.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.CanChangePassword">
            <summary>
            Gets a boolean value that indicates whether <see cref="M:GSF.Security.ISecurityProvider.ChangePassword(System.String,System.String)"/> operation is supported.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.AuthenticationFailureReason">
            <summary>
            Gets an authentication failure reason, if set by the provider when authentication fails.
            </summary>
        </member>
        <member name="P:GSF.Security.ISecurityProvider.LogEvent">
            <summary>
            Gets or sets the <see cref="T:GSF.Security.LogEventFunctionSignature"/> to use for logging security events for the <see cref="T:GSF.Security.SecurityProviderBase"/> implementation.
            </summary>
            <remarks>
            Set <see cref="P:GSF.Security.ISecurityProvider.LogEvent"/> to <c>null</c> to use default handler, i.e., <see cref="M:System.Diagnostics.EventLog.WriteEntry(System.String,System.String,System.Diagnostics.EventLogEntryType,System.Int32)"/>.
            </remarks>
        </member>
        <member name="M:GSF.Security.ISecurityProvider.Authenticate">
            <summary>
            Authenticates the user.
            </summary>
            <returns>true if the user is authenticated, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.ISecurityProvider.RefreshData">
            <summary>
            Refreshes the <see cref="P:GSF.Security.ISecurityProvider.UserData"/> from the backend data store.
            </summary>
            <returns>true if <see cref="P:GSF.Security.ISecurityProvider.UserData"/> is refreshed, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.ISecurityProvider.ResetPassword(System.String)">
            <summary>
            Resets user password in the backend data store.
            </summary>
            <param name="securityAnswer">Answer to the user's security question.</param>
            <returns>true if the password is reset, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.ISecurityProvider.ChangePassword(System.String,System.String)">
            <summary>
            Changes user password in the backend data store.
            </summary>
            <param name="oldPassword">User's current password.</param>
            <param name="newPassword">User's new password.</param>
            <returns>true if the password is changed, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.ISecurityProvider.TranslateRole(System.String)">
            <summary>
            Performs a translation of the specified user <paramref name="role"/>.
            </summary>
            <param name="role">The user role to be translated.</param>
            <returns>The user role that the specified user <paramref name="role"/> translates to.</returns>
        </member>
        <member name="M:GSF.Security.ISecurityProvider.TranslateRedirect(System.String,System.Uri,System.String,System.String)">
            <summary>
            Performs a translation of the default login page to a different endpoint.
            </summary>
            <param name="loginUrl"> The URI of the login page specified in the AppSettings </param>
            <param name="uri"> The URI originally requested. </param>
            <param name="encodedPath"> The URI requested by the client </param>
            <param name="referrer"> The Referrer as specified in the request header </param>
            <returns> The URI to be redirected to</returns>
        </member>
        <member name="M:GSF.Security.ISecurityProvider.GetUserRoles(System.String)">
            <summary>
            Gets a list of Roles for this user for a specified ApplicationId.
            </summary>
            <param name="applicationId">The applicationId for the roles to be returned.</param>
            <returns>The roles that the specified user has.</returns>
        </member>
        <member name="T:GSF.Security.NamespaceDoc">
            <summary>
            Contains fundamental classes that define the security framework for role-based security.
            </summary>
        </member>
        <member name="T:GSF.Security.SecurityProviderBase">
            <summary>
            Base class for a provider of role-based security in applications.
            </summary>
            <example>
            This examples shows how to extend <see cref="T:GSF.Security.SecurityProviderBase"/> to use a flat-file for the security data store:
            <code>
            using System.Data;
            using System.IO;
            using GSF;
            using GSF.Data;
            using GSF.IO;
            using GSF.Security;
            
            namespace CustomSecurity
            {
                public class FlatFileSecurityProvider : SecurityProviderBase
                {
                    private const int LeastPrivilegedLevel = 5;
            
                    public FlatFileSecurityProvider(string username)
                        : base(username)
                    {
                    }
            
                    public override bool RefreshData()
                    {
                        // Check for a valid username.
                        if (string.IsNullOrEmpty(UserData.Username))
                            return false;
            
                        // Check if a file name is specified.
                        if (string.IsNullOrEmpty(ConnectionString))
                            return false;
            
                        // Check if file exist on file system.
                        string file = FilePath.GetAbsolutePath(ConnectionString);
                        if (!File.Exists(file))
                            return false;
            
                        // Read the data from the specified file.
                        DataTable data = File.ReadAllText(file).ToDataTable(",", true);
                        DataRow[] user = data.Select(string.Format("Username = '{0}'", UserData.Username));
                        if (user.Length > 0)
                        {
                            // User exists in the specified file.
                            UserData.IsDefined = true;
                            UserData.Password = user[0]["Password"].ToNonNullString();
            
                            for (int i = LeastPrivilegedLevel; i >= int.Parse(user[0]["Level"].ToNonNullString()); i--)
                            {
                                UserData.Roles.Add(i.ToString());
                            }
                        }
            
                        return true;
                    }
            
                    public override bool Authenticate(string password)
                    {
                        // Compare password hashes to authenticate.
                        return (UserData.Password == SecurityProviderUtility.EncryptPassword(password));
                    }
                }
            }
            </code>
            Config file entries that go along with the above example:
            <code>
            <![CDATA[
            <?xml version="1.0"?>
            <configuration>
              <configSections>
                <section name="categorizedSettings" type="GSF.Configuration.CategorizedSettingsSection, GSF.Core" />
              </configSections>
              <categorizedSettings>
                <securityProvider>
                  <add name="ApplicationName" value="SEC_APP" description="Name of the application being secured as defined in the backend security datastore."
                    encrypted="false" />
                  <add name="ConnectionString" value="Security.csv" description="Connection string to be used for connection to the backend security datastore."
                    encrypted="false" />
                  <add name="ProviderType" value="CustomSecurity.FlatFileSecurityProvider, CustomSecurity"
                    description="The type to be used for enforcing security." encrypted="false" />
                  <add name="IncludedResources" value="*=*" description="Semicolon delimited list of resources to be secured along with role names."
                    encrypted="false" />
                  <add name="ExcludedResources" value="" description="Semicolon delimited list of resources to be excluded from being secured."
                    encrypted="false" />
                  <add name="NotificationSmtpServer" value="localhost" description="SMTP server to be used for sending out email notification messages."
                    encrypted="false" />
                  <add name="NotificationSenderEmail" value="sender@company.com" description="Email address of the sender of email notification messages." 
                    encrypted="false" />
                </securityProvider>
              </categorizedSettings>
            </configuration>
            ]]>
            </code>
            </example>
            <seealso cref="T:GSF.Security.SecurityIdentity"/>
            <seealso cref="T:GSF.Security.SecurityPrincipal"/>
        </member>
        <member name="F:GSF.Security.SecurityProviderBase.DefaultApplicationName">
            <summary>
            Specifies the default value for the <see cref="P:GSF.Security.SecurityProviderBase.ApplicationName"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.SecurityProviderBase.DefaultConnectionString">
            <summary>
            Specifies the default value for the <see cref="P:GSF.Security.SecurityProviderBase.ConnectionString"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.SecurityProviderBase.DefaultPersistSettings">
            <summary>
            Specifies the default value for the <see cref="P:GSF.Security.SecurityProviderBase.PersistSettings"/> property.
            </summary>
        </member>
        <member name="F:GSF.Security.SecurityProviderBase.DefaultSettingsCategory">
            <summary>
            Specifies the default value for the <see cref="P:GSF.Security.SecurityProviderBase.SettingsCategory"/> property.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.#ctor(System.String,System.Boolean,System.Boolean,System.Boolean)">
            <summary>
            Initializes a new instance of the security provider.
            </summary>
            <param name="username">Name that uniquely identifies the user.</param>
            <param name="canRefreshData">true if the security provider can refresh <see cref="P:GSF.Security.SecurityProviderBase.UserData"/> from the backend data store, otherwise false.</param>
            <param name="canResetPassword">true if the security provider can reset user password, otherwise false.</param>
            <param name="canChangePassword">true if the security provider can change user password, otherwise false.</param>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.ApplicationName">
            <summary>
            Gets or sets the name of the application being secured as defined in the backend security datastore.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.ConnectionString">
            <summary>
            Gets or sets the connection string to be used for connection to the backend security datastore.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.PassthroughPrincipal">
            <summary>
            Gets or sets the principal used for passthrough authentication.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.SecurePassword">
            <summary>
            Gets or sets the password as a <see cref="T:System.Security.SecureString"/>.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.Password">
            <summary>
            Gets or sets <see cref="P:GSF.Security.SecurityProviderBase.SecurePassword"/> as clear text password.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.LogEvent">
            <summary>
            Gets or sets the <see cref="T:GSF.Security.LogEventFunctionSignature"/> to use for logging security events for the <see cref="T:GSF.Security.SecurityProviderBase"/> implementation.
            </summary>
            <remarks>
            Set <see cref="P:GSF.Security.SecurityProviderBase.LogEvent"/> to <c>null</c> to use default handler, i.e., <see cref="M:System.Diagnostics.EventLog.WriteEntry(System.String,System.String,System.Diagnostics.EventLogEntryType,System.Int32)"/>.
            </remarks>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.PersistSettings">
            <summary>
            Gets or sets a boolean value that indicates whether security provider settings are to be saved to the config file.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.SettingsCategory">
            <summary>
            Gets or sets the category under which security provider settings are to be saved to the config file if the <see cref="P:GSF.Security.SecurityProviderBase.PersistSettings"/> property is set to true.
            </summary>
            <exception cref="T:System.ArgumentNullException">The value being assigned is a null or empty string.</exception>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.UserData">
            <summary>
            Gets the <see cref="P:GSF.Security.SecurityProviderBase.UserData"/> object containing information about the user.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.IsUserAuthenticated">
            <summary>
            Gets the flag that indicates whether the user was
            authenticated during the last authentication attempt.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.CanRefreshData">
            <summary>
            Gets a boolean value that indicates whether <see cref="M:GSF.Security.SecurityProviderBase.RefreshData"/> operation is supported.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.CanResetPassword">
            <summary>
            Gets a boolean value that indicates whether <see cref="M:GSF.Security.SecurityProviderBase.ResetPassword(System.String)"/> operation is supported.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.CanChangePassword">
            <summary>
            Gets a boolean value that indicates whether <see cref="M:GSF.Security.SecurityProviderBase.ChangePassword(System.String,System.String)"/> operation is supported.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.AuthenticationFailureReason">
            <summary>
            Gets or allows derived classes to set an authentication failure reason.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.IsRedirectRequested">
            <summary>
            Gets the flag that indicates whether the user 
            needs to be redirected after the Authentication attempt. 
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderBase.RequestedRedirect">
            <summary>
            Gets the URI that user will be redirected to if <see cref="P:GSF.Security.SecurityProviderBase.IsRedirectRequested"/> is set.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.Authenticate">
            <summary>
            When overridden in a derived class, authenticates the user.
            </summary>
            <returns>true if the user is authenticated, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.RefreshData">
            <summary>
            When overridden in a derived class, refreshes the <see cref="P:GSF.Security.SecurityProviderBase.UserData"/> from the backend datastore.
            </summary>
            <returns>true if <see cref="P:GSF.Security.SecurityProviderBase.UserData"/> is refreshed, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.ResetPassword(System.String)">
            <summary>
            When overridden in a derived class, resets user password in the backend datastore.
            </summary>
            <param name="securityAnswer">Answer to the user's security question.</param>
            <returns>true if the password is reset, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.ChangePassword(System.String,System.String)">
            <summary>
            When overridden in a derived class, changes user password in the backend datastore.
            </summary>
            <param name="oldPassword">User's current password.</param>
            <param name="newPassword">User's new password.</param>
            <returns>true if the password is changed, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.SaveSettings">
            <summary>
            Saves security provider settings to the config file if the <see cref="P:GSF.Security.SecurityProviderBase.PersistSettings"/> property is set to true.
            </summary>
            <exception cref="T:System.Configuration.ConfigurationErrorsException"><see cref="P:GSF.Security.SecurityProviderBase.SettingsCategory"/> has a value of null or empty string.</exception>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.LoadSettings">
            <summary>
            Loads saved security provider settings from the config file if the <see cref="P:GSF.Security.SecurityProviderBase.PersistSettings"/> property is set to true.
            </summary>
            <exception cref="T:System.Configuration.ConfigurationErrorsException"><see cref="P:GSF.Security.SecurityProviderBase.SettingsCategory"/> has a value of null or empty string.</exception>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.TranslateRole(System.String)">
            <summary>
            Performs a translation of the specified user <paramref name="role"/>.
            </summary>
            <param name="role">The user role to be translated.</param>
            <returns>The user role that the specified user <paramref name="role"/> translates to.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.TranslateRedirect(System.String,System.Uri,System.String,System.String)">
            <summary>
            Performs a translation of the default login page to a different endpoint.
            </summary>
            <param name="loginUrl"> The URI of the login page specified in the AppSettings </param>
            <param name="uri"> The URI originally requested. </param>
            <param name="encodedPath"> The URI requested by the client </param>
            <param name="referrer"> The Referrer as specified in the request header </param>
            <returns> The URI to be redirected to</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderBase.GetUserRoles(System.String)">
            <summary>
            Gets a list of Roles for this user for a specified ApplicationId.
            </summary>
            <param name="applicationId">The applicationId for the roles to be returned.</param>
            <returns>The roles that the specified user has.</returns>
        </member>
        <member name="T:GSF.Security.SecurityIdentity">
            <summary>
            A class that implements <see cref="T:System.Security.Principal.IIdentity"/> interface to facilitate custom role-based security.
            </summary>
            <seealso cref="T:GSF.Security.SecurityPrincipal"/>
            <seealso cref="T:GSF.Security.ISecurityProvider"/>
        </member>
        <member name="M:GSF.Security.SecurityIdentity.#ctor(GSF.Security.ISecurityProvider)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.SecurityIdentity"/> class.
            </summary>
            <param name="provider">An <see cref="T:GSF.Security.ISecurityProvider"/> of the user.</param>
            <exception cref="T:System.ArgumentNullException">Value specified for <paramref name="provider"/> is null.</exception>
        </member>
        <member name="P:GSF.Security.SecurityIdentity.AuthenticationType">
            <summary>
            Gets the type of authentication used to identify the user.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityIdentity.IsAuthenticated">
            <summary>
            Gets a boolean value that indicates whether the user has been authenticated.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityIdentity.Name">
            <summary>
            Gets the user's login name.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityIdentity.Type">
            <summary>
            Gets the user type.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityIdentity.Provider">
            <summary>
            Gets the <see cref="T:GSF.Security.ISecurityProvider"/> of the user.
            </summary>
        </member>
        <member name="T:GSF.Security.SecurityPrincipal">
            <summary>
            A class that implements <see cref="T:System.Security.Principal.IPrincipal"/> interface to facilitate custom role-based security.
            </summary>
            <seealso cref="T:GSF.Security.SecurityIdentity"/>
            <seealso cref="T:GSF.Security.ISecurityProvider"/>
        </member>
        <member name="M:GSF.Security.SecurityPrincipal.#ctor(GSF.Security.SecurityIdentity)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.SecurityPrincipal"/> class.
            </summary>
            <param name="identity">An <see cref="T:GSF.Security.SecurityIdentity"/> object.</param>
            <exception cref="T:System.ArgumentNullException">Value specified for <paramref name="identity"/> is null.</exception>
        </member>
        <member name="P:GSF.Security.SecurityPrincipal.Identity">
            <summary>
            Gets the <see cref="T:GSF.Security.SecurityIdentity"/> object of the user.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityPrincipal.System#Security#Principal#IPrincipal#Identity">
            <summary>
            Gets the <see cref="T:System.Security.Principal.IIdentity"/> object of the user.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityPrincipal.IsInRole(System.String)">
            <summary>
            Determines whether the user is a member of either of the specified <paramref name="roles"/>.
            </summary>
            <param name="roles">Comma separated list of roles to check.</param>
            <returns>true if the user is a member of either of the specified <paramref name="roles"/>, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.SecurityPrincipal.GetFailureReasonPhrase(GSF.Security.SecurityPrincipal,System.String,System.Boolean)">
            <summary>
            Gets the reason phrase to return for an unauthorized response.
            </summary>
            <param name="securityPrincipal">Security principal being authenticated, can be <c>null</c>.</param>
            <param name="authorizationScheme">Authentication scheme in use.</param>
            <param name="useProviderReason"><c>true</c> to use detailed response from security provider.</param>
            <returns>Reason phrase to return for an unauthorized response.</returns>
            <remarks>
            Detailed provider response should normally only be used for diagnostics, a more obscure reason is considered
            more secure since it limits knowledge about the successful elements of an authentication attempt.
            </remarks>
        </member>
        <member name="T:GSF.Security.SecurityProviderCache">
            <summary>
            A helper class that manages the caching of <see cref="T:GSF.Security.ISecurityProvider"/>s.
            </summary>
        </member>
        <member name="T:GSF.Security.SecurityProviderCache.CacheContext">
            <summary>
            A class that facilitates the caching of <see cref="T:GSF.Security.ISecurityProvider"/>.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.CacheContext.#ctor(GSF.Security.ISecurityProvider)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.SecurityProviderCache.CacheContext"/> class.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.CacheContext.#ctor(System.WeakReference{GSF.Security.ISecurityProvider})">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.SecurityProviderCache.CacheContext"/> class.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderCache.CacheContext.Provider">
            <summary>
            Gets the <see cref="T:GSF.Security.ISecurityProvider"/> managed by this <see cref="T:GSF.Security.SecurityProviderCache.CacheContext"/>.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderCache.CacheContext.LastRefreshTime">
            <summary>
            Gets the <see cref="T:System.DateTime"/> of when the <see cref="T:GSF.Security.SecurityProviderCache.CacheContext"/> was last refreshed.
            </summary>
        </member>
        <member name="P:GSF.Security.SecurityProviderCache.CacheContext.LastAccessTime">
            <summary>
            Gets the <see cref="T:System.DateTime"/> of when the <see cref="T:GSF.Security.SecurityProviderCache.CacheContext"/> was last accessed.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.CacheContext.Refresh">
            <summary>
            Refreshes the provider managed by this <see cref="T:GSF.Security.SecurityProviderCache.CacheContext"/>.
            </summary>
        </member>
        <member name="F:GSF.Security.SecurityProviderCache.DefaultUserCacheTimeout">
            <summary>
            Number of minutes up to which <see cref="T:GSF.Security.ISecurityProvider"/>s are to be cached.
            </summary>
        </member>
        <member name="F:GSF.Security.SecurityProviderCache.CacheMonitorTimerInterval">
            <summary>
            Number of milliseconds between calls to monitor the cache.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.#ctor(System.String)">
            <summary>
            Creates a new <see cref="T:GSF.Security.SecurityProviderCache"/>.
            </summary>
            <param name="settingsCategory">Settings category.</param>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.CreateProvider(System.String,System.Security.Principal.IPrincipal,System.Boolean)">
            <summary>
            Creates a new provider from data cached by the <see cref="T:GSF.Security.SecurityProviderCache"/>.
            </summary>
            <param name="username">The username of the user for which to create a new provider.</param>
            <param name="passthroughPrincipal"><see cref="T:System.Security.Principal.IPrincipal"/> obtained through alternative authentication mechanisms to provide authentication for the <see cref="T:GSF.Security.ISecurityProvider"/>.</param>
            <param name="autoRefresh">Indicates whether the provider should be automatically refreshed on a timer.</param>
            <returns>A new provider initialized from cached data.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.Flush(System.String)">
            <summary>
            Removes any cached information about the user with the given username.
            </summary>
            <param name="username">The username of the user to be flushed from the cache.</param>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.AutoRefresh(GSF.Security.ISecurityProvider)">
            <summary>
            Adds the given provider to the collection of providers being automatically refreshed on the user cache timeout interval.
            </summary>
            <param name="provider">The security provider to be cached.</param>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.DisableAutoRefresh(GSF.Security.ISecurityProvider)">
            <summary>
            Removes the given provider from the collection of providers being automatically refreshed.
            </summary>
            <param name="provider">The provider to be removed.</param>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.RefreshAll">
            <summary>
            Forces all cached providers to refresh state.
            </summary>
        </member>
        <member name="F:GSF.Security.SecurityProviderCache.DefaultAlternateSettingsCategory">
            <summary>
            Specifies the default value for the SettingsCategory property for the AlternateSecurityProvider.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.CreateProvider(System.String,System.Security.Principal.IPrincipal,System.Boolean,System.Boolean)">
            <summary>
            Creates a new provider from data cached by the <see cref="T:GSF.Security.SecurityProviderCache"/>.
            </summary>
            <param name="username">The username of the user for which to create a new provider.</param>
            <param name="passthroughPrincipal"><see cref="T:System.Security.Principal.IPrincipal"/> obtained through alternative authentication mechanisms to provide authentication for the <see cref="T:GSF.Security.ISecurityProvider"/>.</param>
            <param name="autoRefresh">Indicates whether the provider should be automatically refreshed on a timer.</param>
            <param name="useAlternate">Indicates whether the alternate <see cref="T:GSF.Security.ISecurityProvider"/> should be used.</param>
            <returns>A new provider initialized from cached data.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.Flush(System.String,System.Boolean)">
            <summary>
            Removes any cached information about the user with the given username.
            </summary>
            <param name="username">The username of the user to be flushed from the cache.</param>
            <param name="useAlternate">Indicates whether the alternate <see cref="T:GSF.Security.ISecurityProvider"/> should be used.</param>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.AutoRefresh(GSF.Security.ISecurityProvider,System.Boolean)">
            <summary>
            Adds the given provider to the collection of providers being automatically refreshed on the user cache timeout interval.
            </summary>
            <param name="provider">The security provider to be cached.</param>
            <param name="useAlternate">Indicates whether the alternate <see cref="T:GSF.Security.ISecurityProvider"/> should be used.</param>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.DisableAutoRefresh(GSF.Security.ISecurityProvider,System.Boolean)">
            <summary>
            Removes the given provider from the collection of providers being automatically refreshed.
            </summary>
            <param name="provider">The provider to be removed.</param>
            <param name="useAlternate">Indicates whether the alternate <see cref="T:GSF.Security.ISecurityProvider"/> should be used.</param>
        </member>
        <member name="M:GSF.Security.SecurityProviderCache.RefreshAll(System.Boolean)">
            <summary>
            Forces all cached providers to refresh state.
            </summary>
            <param name="useAlternate">Indicates whether the alternate <see cref="T:GSF.Security.ISecurityProvider"/> should be used.</param>
        </member>
        <member name="T:GSF.Security.SecurityProviderUtility">
            <summary>
            A helper class containing methods used in the implementation of role-based security.
            </summary>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.CreateProvider(System.String,System.String)">
            <summary>
            Creates a new <see cref="T:GSF.Security.ISecurityProvider"/> based on the settings in the config file.
            </summary>
            <param name="username">Username of the user for whom the <see cref="T:GSF.Security.ISecurityProvider"/> is to be created.</param>
            <param name="settingsCategory">The category used to store configuration settings for the provider.</param>
            <returns>An object that implements <see cref="T:GSF.Security.ISecurityProvider"/>.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.CreateProvider(System.String,System.Security.Principal.IPrincipal,System.String)">
            <summary>
            Creates a new <see cref="T:GSF.Security.ISecurityProvider"/> based on the settings in the config file.
            </summary>
            <param name="username">Username of the user for whom the <see cref="T:GSF.Security.ISecurityProvider"/> is to be created.</param>
            <param name="passthroughPrincipal"><see cref="T:System.Security.Principal.IPrincipal"/> obtained through alternative authentication mechanisms to provide authentication for the <see cref="T:GSF.Security.ISecurityProvider"/>.</param>
            <param name="settingsCategory">The category used to store configuration settings for the provider.</param>
            <returns>An object that implements <see cref="T:GSF.Security.ISecurityProvider"/>.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.CreateProvider(GSF.Security.UserData,System.String)">
            <summary>
            Creates a new <see cref="T:GSF.Security.ISecurityProvider"/> based on the settings in the config file.
            </summary>
            <param name="userData">Object that contains data about the user to be used by the security provider.</param>
            <param name="settingsCategory">The category used to store configuration settings for the provider.</param>
            <returns>An object that implements <see cref="T:GSF.Security.ISecurityProvider"/>.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.IsResourceSecurable(System.String)">
            <summary>
            Determines if the specified <paramref name="resource"/> is to be secured based on settings in the config file.
            </summary>
            <param name="resource">Name of the resource to be checked.</param>
            <returns>true if the <paramref name="resource"/> is to be secured; otherwise false/</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.IsResourceAccessible(System.String,System.Security.Principal.IPrincipal)">
            <summary>
            Determines if the current user, as defined by the <paramref name="principal"/>, has permission to access 
            the specified <paramref name="resource"/> based on settings in the config file.
            </summary>
            <param name="resource">Name of the resource to be checked.</param>
            <param name="principal">The principal providing the security context for the user.</param>
            <returns>true if the current user has permission to access the <paramref name="resource"/>; otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.IsRegexMatch(System.String,System.String)">
            <summary>
            Determines if the specified <paramref name="target"/> matches the specified <paramref name="spec"/>.
            </summary>
            <param name="spec">Spec string that can include wildcards ('*'). For example, *.txt</param>
            <param name="target">Target string to be compared with the <paramref name="spec"/>.</param>
            <returns>true if the <paramref name="target"/> matches the <paramref name="spec"/>, otherwise false.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.EncryptPassword(System.String)">
            <summary>
            Encrypts the password to a one-way hash using the SHA1 hash algorithm.
            </summary>
            <param name="password">Password to be encrypted.</param>
            <returns>Encrypted password.</returns>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.GeneratePassword(System.Int32)">
            <summary>
            Generates a random password of the specified <paramref name="length"/> with at least one uppercase letter, one lowercase letter, one special character and one digit.
            </summary>
            <param name="length">Length of the password to generate.</param>
            <returns>Randomly generated password of the specified <paramref name="length"/>.</returns>
            <exception cref="T:System.ArgumentException">A value of less than 8 is specified for the <paramref name="length"/>.</exception>
        </member>
        <member name="M:GSF.Security.SecurityProviderUtility.SendNotification(System.String,System.String,System.String)">
            <summary>
            Sends email notification message to the specified <paramref name="recipient"/> using settings specified in the config file.
            </summary>
            <param name="recipient">Email address of the notification recipient.</param>
            <param name="subject">Subject of the notification.</param>
            <param name="body">Content of the notification.</param>
        </member>
        <member name="T:GSF.Security.UserData">
            <summary>
            A serializable class that contains information about a user defined in the security data store.
            </summary>
        </member>
        <member name="M:GSF.Security.UserData.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.UserData"/> class.
            </summary>
        </member>
        <member name="M:GSF.Security.UserData.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.UserData"/> class.
            </summary>
            <param name="username">User's logon name.</param>
        </member>
        <member name="M:GSF.Security.UserData.#ctor(GSF.Security.UserData)">
            <summary>
            Initializes a new instance of the <see cref="T:GSF.Security.UserData"/> class by copying an existing instance.
            </summary>
            <param name="userData">The existing instance of the <see cref="T:GSF.Security.UserData"/> class.</param>
        </member>
        <member name="P:GSF.Security.UserData.LoginID">
            <summary>
            Gets the user's login ID.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.Username">
            <summary>
            Gets the user's login name.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.Password">
            <summary>
            Gets the user's password.
            </summary>
            <remarks>
            This field is only used to store hashed user
            passwords which are stored in the database.
            </remarks>
        </member>
        <member name="P:GSF.Security.UserData.FirstName">
            <summary>
            Gets the user's first name.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.LastName">
            <summary>
            Gets the user's last name.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.CompanyName">
            <summary>
            Gets the user's company name.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.PhoneNumber">
            <summary>
            Gets the user's phone number.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.EmailAddress">
            <summary>
            Gets the user's email address.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.SecurityQuestion">
            <summary>
            Gets the user's security question.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.SecurityAnswer">
            <summary>
            Gets the user's security answer.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.PasswordChangeDateTime">
            <summary>
            Gets the UTC date and time when user must change the password.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.AccountCreatedDateTime">
            <summary>
            Gets the UTC date and time when user account was created.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.IsDefined">
            <summary>
            Gets a boolean value that indicates whether the user is defined in the backend security data store.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.IsExternal">
            <summary>
            Gets a boolean value that indicates whether the user is defined as an external user in the backend security data store.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.IsAzureAD">
            <summary>
            Gets a boolean value that indicates whether the user is defined as an AzureAD account.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.IsDisabled">
            <summary>
            Gets a boolean value that indicates whether the user account has been disabled.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.IsLockedOut">
            <summary>
            Gets a boolean value that indicates whether the user account has been locked due to numerous unsuccessful login attempts.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.Groups">
            <summary>
            Gets a read-only list of all the groups the user belongs to.
            </summary>
        </member>
        <member name="P:GSF.Security.UserData.Roles">
            <summary>
            Gets a read-only list of all the roles assigned to the user.
            </summary>
        </member>
        <member name="M:GSF.Security.UserData.Initialize">
            <summary>
            Initializes this <see cref="T:GSF.Security.UserData"/> object.
            </summary>
        </member>
        <member name="M:GSF.Security.UserData.Clone(GSF.Security.UserData)">
            <summary>
            Copies a new instance of the <see cref="T:GSF.Security.UserData"/> class by copying an existing instance.
            </summary>
            <param name="userData">The existing instance of the <see cref="T:GSF.Security.UserData"/> class.</param>
        </member>
        <member name="T:GSF.Security.UserDataCache">
            <summary>
            Represents a secured inter-process cache for a <see cref="T:System.Collections.Generic.Dictionary`2"/> of serialized <see cref="T:GSF.Security.UserData"/>.
            </summary>
            <remarks>
            This is a personal user data cache that only contains basic LDAP information for the user. It is used to load the local and
            Active Directory groups a user is associated with when the user no longer has access to its domain server. This can happen
            when a laptop that is normally connected to the Active Directory domain gets shutdown then restarted without access to the
            domain, for example, on an airplane - in this mode the user can successfully still login to the laptop to their using domain
            account cached by Windows but the groups the user is in will no longer be accessible. If role based security happens to be
            based on Active Directory groups, this cache will make sure the user can still have needed role based access even when the
            domain is unavailable. This cache is maintained as a separate user cache from the system level <see cref="T:GSF.Security.AdoSecurityCache"/>
            since the user data cache only contains group information and is used by the <see cref="T:GSF.Security.LdapSecurityProvider"/> which can be
            used independently of the <see cref="T:GSF.Security.AdoSecurityProvider"/>.
            </remarks>
        </member>
        <member name="M:GSF.Security.UserDataCache.#ctor(System.Int32)">
            <summary>
            Creates a new instance of the <see cref="T:GSF.Security.UserDataCache"/>.
            </summary>
            <param name="providerID">Unique provider ID used to distinguish cached user data that may be different based on provider.</param>
        </member>
        <member name="M:GSF.Security.UserDataCache.#ctor(System.Int32,System.Int32)">
            <summary>
            Creates a new instance of the <see cref="T:GSF.Security.UserDataCache"/> with the specified number of <paramref name="maximumConcurrentLocks"/>.
            </summary>
            <param name="maximumConcurrentLocks">Maximum concurrent reader locks to allow.</param>
            <param name="providerID">Unique provider ID used to distinguish cached user data that may be different based on provider.</param>
        </member>
        <member name="P:GSF.Security.UserDataCache.Item(System.String)">
            <summary>
            Gets or sets <see cref="T:GSF.Security.UserData"/> for given <paramref name="loginID"/>.
            </summary>
            <param name="loginID">Login ID of associated <see cref="T:GSF.Security.UserData"/> to load or save.</param>
            <returns>Reference to <see cref="T:GSF.Security.UserData"/> for given <paramref name="loginID"/> if found; otherwise <c>null</c>.</returns>
        </member>
        <member name="P:GSF.Security.UserDataCache.ProviderID">
            <summary>
            Gets or sets unique provider ID used to distinguish cached user data that may be different based on provider.
            </summary>
        </member>
        <member name="M:GSF.Security.UserDataCache.TryGetUserData(System.String,GSF.Security.UserData@)">
            <summary>
            Attempts to retrieve <see cref="T:GSF.Security.UserData"/> for given <paramref name="loginID"/>.
            </summary>
            <param name="loginID">Login ID of associated <see cref="T:GSF.Security.UserData"/> to retrieve.</param>
            <param name="userData">Reference to <see cref="T:GSF.Security.UserData"/> object to populate if found.</param>
            <returns><c>true</c> if <see cref="T:GSF.Security.UserData"/> for given <paramref name="loginID"/> was retrieved; otherwise <c>false</c>.</returns>
        </member>
        <member name="M:GSF.Security.UserDataCache.SaveUserData(System.String,GSF.Security.UserData)">
            <summary>
            Serializes the <paramref name="userData"/> for the given <paramref name="loginID"/> into the <see cref="T:GSF.Security.UserDataCache"/>.
            </summary>
            <param name="loginID">Login ID of associated <see cref="T:GSF.Security.UserData"/> to retrieve.</param>
            <param name="userData">Reference to <see cref="T:GSF.Security.UserData"/> object to serialize into <see cref="T:GSF.Security.UserDataCache"/>.</param>
            <remarks>
            <para>
            This will add an entry into the user data cache for <paramref name="loginID"/> if it doesn't exist;
            otherwise existing entry will be updated.
            </para>
            <para>
            Updates are automatically queued up for serialization so user does not need to call <see cref="M:GSF.Security.UserDataCache.Save"/>.
            </para>
            </remarks>
        </member>
        <member name="M:GSF.Security.UserDataCache.Save">
            <summary>
            Initiates inter-process synchronized save of user data cache.
            </summary>
        </member>
        <member name="M:GSF.Security.UserDataCache.SaveFileData(System.IO.FileStream,System.Byte[])">
            <summary>
            Handles serialization of file to disk; virtual method allows customization (e.g., pre-save encryption and/or data merge).
            </summary>
            <param name="fileStream"><see cref="T:System.IO.FileStream"/> used to serialize data.</param>
            <param name="fileData">File data to be serialized.</param>
            <remarks>
            Consumers overriding this method should not directly call <see cref="P:GSF.IO.InterprocessCache.FileData"/> property to avoid potential dead-locks.
            </remarks>
        </member>
        <member name="M:GSF.Security.UserDataCache.LoadFileData(System.IO.FileStream)">
            <summary>
            Handles deserialization of file from disk; virtual method allows customization (e.g., pre-load decryption and/or data merge).
            </summary>
            <param name="fileStream"><see cref="T:System.IO.FileStream"/> used to deserialize data.</param>
            <returns>Deserialized file data.</returns>
            <remarks>
            Consumers overriding this method should not directly call <see cref="P:GSF.IO.InterprocessCache.FileData"/> property to avoid potential dead-locks.
            </remarks>
        </member>
        <member name="M:GSF.Security.UserDataCache.HashLoginID(System.String)">
            <summary>
            Calculates the hash of the <paramref name="loginID"/> used as the key for the user data cache.
            </summary>
            <param name="loginID">Login ID to hash.</param>
            <returns>The Base64 encoded calculated SHA-2 hash of the <paramref name="loginID"/> used as the key for the user data cache.</returns>
            <remarks>
            For added security, a hash of the <paramref name="loginID"/> is used as the key for <see cref="T:GSF.Security.UserData"/> in the
            user data cache instead of the actual <paramref name="loginID"/>. This method allows the
            consumer to properly calculate this hash when directly using the user data cache.
            </remarks>
        </member>
        <member name="M:GSF.Security.UserDataCache.GetCurrentCache(System.Int32)">
            <summary>
            Loads the <see cref="T:GSF.Security.UserDataCache"/> for the current local user.
            </summary>
            <param name="providerID">Unique security provider ID used to distinguish cached user data that may be different based on provider.</param>
            <returns>Loaded instance of the <see cref="T:GSF.Security.UserDataCache"/>.</returns>
        </member>
    </members>
</doc>
