From a3c6cdd37a81803fdccde0dc3bc723aec90a3b96 Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Sun, 14 Apr 2019 22:11:33 +0200 Subject: [PATCH] Fix obsolete XML comments (#1074) * Fix obsolete XML comments * Improving the XML comments in MsalError to make them more actionable. * Addressing PR feedback * fix typo --- .../AuthenticationResult.cs | 4 +- .../ClientApplicationBase.cs | 2 +- .../ConfidentialClientApplication.cs | 5 +- .../DeviceCodeResult.cs | 2 +- src/Microsoft.Identity.Client/IAccount.cs | 4 +- .../IByRefreshToken.cs | 2 +- .../IClientApplicationBase.cs | 1 - .../IConfidentialClientApplication.cs | 5 +- src/Microsoft.Identity.Client/MsalError.cs | 171 +++++++++++++++--- .../MsalServiceException.cs | 7 +- .../MsalUiRequiredException.cs | 2 +- src/Microsoft.Identity.Client/Prompt.cs | 4 +- .../UserAssertion.cs | 5 +- 13 files changed, 162 insertions(+), 52 deletions(-) diff --git a/src/Microsoft.Identity.Client/AuthenticationResult.cs b/src/Microsoft.Identity.Client/AuthenticationResult.cs index 1a7eefa328..121cb33b6c 100644 --- a/src/Microsoft.Identity.Client/AuthenticationResult.cs +++ b/src/Microsoft.Identity.Client/AuthenticationResult.cs @@ -149,7 +149,7 @@ internal AuthenticationResult(MsalAccessTokenCacheItem msalAccessTokenCacheItem, /// /// Gets the account information. Some elements in might be null if not returned by the /// service. The account can be passed back in some API overloads to identify which account should be used such - /// as or + /// as or /// for instance /// public IAccount Account { get; } @@ -183,4 +183,4 @@ public string CreateAuthorizationHeader() return Oauth2AuthorizationHeader + AccessToken; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Identity.Client/ClientApplicationBase.cs b/src/Microsoft.Identity.Client/ClientApplicationBase.cs index 6abc9d13d3..48a2a532f5 100644 --- a/src/Microsoft.Identity.Client/ClientApplicationBase.cs +++ b/src/Microsoft.Identity.Client/ClientApplicationBase.cs @@ -76,7 +76,7 @@ public abstract partial class ClientApplicationBase : IClientApplicationBase /// /// User token cache. This case holds id tokens, access tokens and refresh tokens for accounts. It's used /// and updated silently if needed when calling - /// or one of the overrides of . + /// or one of the overrides of . /// It is updated by each AcquireTokenXXX method, with the exception of AcquireTokenForClient which only uses the application /// cache (see IConfidentialClientApplication). /// diff --git a/src/Microsoft.Identity.Client/ConfidentialClientApplication.cs b/src/Microsoft.Identity.Client/ConfidentialClientApplication.cs index 7acbd28079..80a7978c96 100644 --- a/src/Microsoft.Identity.Client/ConfidentialClientApplication.cs +++ b/src/Microsoft.Identity.Client/ConfidentialClientApplication.cs @@ -74,7 +74,7 @@ internal ConfidentialClientApplication(ApplicationConfiguration configuration) /// It's usually used in Web Apps (for instance ASP.NET / ASP.NET Core Web apps) which sign-in users, /// and can request an authorization code. /// This method does not lookup the token cache, but stores the result in it, so it can be looked up - /// using other methods such as . + /// using other methods such as . /// /// Scopes requested to access a protected API /// The authorization code received from the service authorization endpoint. @@ -174,8 +174,7 @@ AcquireTokenByRefreshTokenParameterBuilder IByRefreshToken.AcquireTokenByRefresh /// /// Application token cache. This case holds access tokens and refresh tokens for the application. It's maintained - /// and updated silently if needed when or one - /// of the overrides of + /// and updated silently if needed when /// /// On .NET Framework and .NET Core you can also customize the token cache serialization. /// See https://aka.ms/msal-net-token-cache-serialization. This is taken care of by MSAL.NET on other platforms diff --git a/src/Microsoft.Identity.Client/DeviceCodeResult.cs b/src/Microsoft.Identity.Client/DeviceCodeResult.cs index eb18de0a51..8650f49a29 100644 --- a/src/Microsoft.Identity.Client/DeviceCodeResult.cs +++ b/src/Microsoft.Identity.Client/DeviceCodeResult.cs @@ -39,7 +39,7 @@ namespace Microsoft.Identity.Client /// to be entered on that device. /// See https://aka.ms/msal-device-code-flow. /// - /// and + /// and /// the other overrides /// public class DeviceCodeResult diff --git a/src/Microsoft.Identity.Client/IAccount.cs b/src/Microsoft.Identity.Client/IAccount.cs index 59be474842..2789399a4c 100644 --- a/src/Microsoft.Identity.Client/IAccount.cs +++ b/src/Microsoft.Identity.Client/IAccount.cs @@ -32,7 +32,7 @@ namespace Microsoft.Identity.Client /// The IAccount interface represents information about a single account. /// The same user can be present in different tenants, that is, a user can have multiple accounts. /// An IAccount is returned in the . property, and can be used as parameters - /// of PublicClientApplication and ConfidentialClientApplication methods acquiring tokens such as + /// of PublicClientApplication and ConfidentialClientApplication methods acquiring tokens such as /// public interface IAccount { @@ -56,4 +56,4 @@ public interface IAccount /// Can be null, for example if this account was migrated to MSAL.NET from ADAL.NET v3's token cache AccountId HomeAccountId { get; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Identity.Client/IByRefreshToken.cs b/src/Microsoft.Identity.Client/IByRefreshToken.cs index a5c8187494..18429710d0 100644 --- a/src/Microsoft.Identity.Client/IByRefreshToken.cs +++ b/src/Microsoft.Identity.Client/IByRefreshToken.cs @@ -41,7 +41,7 @@ public partial interface IByRefreshToken { /// /// Acquires an access token from an existing refresh token and stores it and the refresh token into - /// the user token cache, where it will be available for further AcquireTokenSilentAsync calls. + /// the user token cache, where it will be available for further AcquireTokenSilent calls. /// This method can be used in migration to MSAL from ADAL v2 and in various integration /// scenarios where you have a RefreshToken available. /// (see https://aka.ms/msal-net-migration-adal2-msal2) diff --git a/src/Microsoft.Identity.Client/IClientApplicationBase.cs b/src/Microsoft.Identity.Client/IClientApplicationBase.cs index 99084b0cb4..6c1a195c25 100644 --- a/src/Microsoft.Identity.Client/IClientApplicationBase.cs +++ b/src/Microsoft.Identity.Client/IClientApplicationBase.cs @@ -45,7 +45,6 @@ public partial interface IClientApplicationBase /// /// User token cache. This case holds id tokens, access tokens and refresh tokens for accounts. It's used /// and updated silently if needed when calling - /// or one of the overrides of . /// It is updated by each AcquireTokenXXX method, with the exception of AcquireTokenForClient which only uses the application /// cache (see IConfidentialClientApplication). /// diff --git a/src/Microsoft.Identity.Client/IConfidentialClientApplication.cs b/src/Microsoft.Identity.Client/IConfidentialClientApplication.cs index f746d8a6e4..631df8c9a2 100644 --- a/src/Microsoft.Identity.Client/IConfidentialClientApplication.cs +++ b/src/Microsoft.Identity.Client/IConfidentialClientApplication.cs @@ -41,8 +41,7 @@ public partial interface IConfidentialClientApplication : IClientApplicationBase { /// /// Application token cache. This case holds access tokens and refresh tokens for the application. It's maintained - /// and updated silently if needed when or one - /// of the overrides of + /// and updated silently if needed when /// /// On .NET Framework and .NET Core you can also customize the token cache serialization. /// See https://aka.ms/msal-net-token-cache-serialization. This is taken care of by MSAL.NET on other platforms @@ -56,7 +55,7 @@ public partial interface IConfidentialClientApplication : IClientApplicationBase /// It's usually used in Web Apps (for instance ASP.NET / ASP.NET Core Web apps) which sign-in users, /// and can request an authorization code. /// This method does not lookup the token cache, but stores the result in it, so it can be looked up - /// using other methods such as . + /// using other methods such as . /// /// Scopes requested to access a protected API /// The authorization code received from the service authorization endpoint. diff --git a/src/Microsoft.Identity.Client/MsalError.cs b/src/Microsoft.Identity.Client/MsalError.cs index 4d1cb6f058..b83ddea2df 100644 --- a/src/Microsoft.Identity.Client/MsalError.cs +++ b/src/Microsoft.Identity.Client/MsalError.cs @@ -33,9 +33,9 @@ namespace Microsoft.Identity.Client public static class MsalError { /// - /// Standard OAuth2 protocol error code. It indicates to the libray that the application needs to expose the UI to the user + /// Standard OAuth2 protocol error code. It indicates that the application needs to expose the UI to the user /// so that the user does an interactive action in order to get a new token. - /// Mitigation: If your application is a call one of the AcquireTokenAsync overrides to + /// Mitigation: If your application is a call AcquireTokenInteractive /// perform an interactive authentication. If your application is a chances are that the Claims member /// of the exception is not empty. See for the right mitigation /// @@ -45,56 +45,70 @@ public static class MsalError #pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved #endif /// - /// Mitigation: If your application is a call one of the AcquireTokenAsync overrides so - /// that the user of your application signs-in and accepts consent. If your application is a . If it's a Web App - /// you should have previously called - /// as described in https://aka.ms/msal-net-authorization-code. This error should not happen in Web APIs. + /// No token was found in the token cache. + /// Mitigation: If your application is a call AcquireTokenInteractive so + /// that the user of your application signs-in and accepts consent. If your application is a .: + /// + /// + /// If it's a Web App you should have previously called + /// as described in https://aka.ms/msal-net-authorization-code. You need to make sure that you have requested the right scopes. For details + /// See https://github.com/Azure-Samples/ms-identity-aspnetcore-webapp-tutorial + /// + /// This error should not happen in Web APIs + /// /// public const string NoTokensFoundError = "no_tokens_found"; #pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved /// - /// This error code comes back from calls when a null user is - /// passed as the account parameter. + /// This error code comes back from calls when a null user is + /// passed as the account parameter. This can be because you have called AcquireTokenSilent with an account parameter + /// set to accounts.FirstOrDefault() but accounts is empty. + /// Mitigation + /// Pass a different account, or otherwise call /// public const string UserNullError = "user_null"; /// /// This error code denotes that no account was found having the given login hint. + /// What happens? + /// + /// or + /// was called with a loginHint parameter which does not match any account in + /// Mitigation + /// If you are certain about the loginHint, call /// public const string NoAccountForLoginHint = "no_account_for_login_hint"; /// /// This error code denotes that multiple accounts were found having the same login hint and MSAL - /// cannot chose one. Please use the overload of AcquireTokenSilent where you pass an account. + /// cannot chose one. Please use to specify the account /// public const string MultipleAccountsForLoginHint = "multiple_accounts_for_login_hint"; /// - /// This error code comes back from calls when - /// the user cache had not been set in the application constructor. + /// This error code comes back from calls when + /// the user cache had not been set in the application constructor. This should never happen in MSAL.NET 3.x as the cache is created by the applicaiton /// public const string TokenCacheNullError = "token_cache_null"; - // TODO(migration): Prompt.Never no longer exists. Validate removing this error message. /// /// One of two conditions was encountered: /// - /// The Prompt.Never UI behavior was passed in an interactive token call, but the constraint could not be honored because user interaction is required, + /// The Prompt.NoPrompt was passed in an interactive token call, but the constraint could not be honored because user interaction is required, /// for instance because the user needs to re-sign-in, give consent for more scopes, or perform multiple factor authentication. /// /// /// An error occurred during a silent web authentication that prevented the authentication flow from completing in a short enough time frame. /// /// - /// Remediation:call one of the AcquireTokenAsync overrides so that the user of your application signs-in and accepts consent. + /// Remediation:call AcquireTokenInteractive so that the user of your application signs-in and accepts consent. /// public const string NoPromptFailedError = "no_prompt_failed"; /// /// Service is unavailable and returned HTTP error code within the range of 500-599 - /// Mitigation you can retry after a delay. Note that the retry-after header is not yet - /// surfaced in MSAL.NET (on the backlog) + /// Mitigation you can retry after a delay. /// public const string ServiceNotAvailable = "service_not_available"; @@ -105,8 +119,8 @@ public static class MsalError public const string RequestTimeout = "request_timeout"; /// - /// Upn required - /// What happens? An override of a token acquisition operation was called in which + /// loginHint should be a Upn + /// What happens? An override of a token acquisition operation was called in which /// takes a loginHint as a parameters, but this login hint was not using the UserPrincipalName (UPN) format, e.g. john.doe@contoso.com /// expected by the service /// Remediation Make sure in your code that you enforce loginHint to be a UPN @@ -133,6 +147,9 @@ public static class MsalError /// /// Invalid authority type. + /// MSAL.NET does not know how to interact with the authority specified when the application was built. + /// Mitigation + /// Use a different authority /// public const string InvalidAuthorityType = "invalid_authority_type"; @@ -144,19 +161,40 @@ public static class MsalError /// /// Authentication failed. + /// What happens? + /// The authentication failed. For instance the user did not enter the right password + /// Mitigation + /// Inform the user to retry. /// public const string AuthenticationFailed = "authentication_failed"; /// /// Authority validation failed. + /// What happens? + /// The validation of the authority failed. This might be because the authority is not + /// compliant with the OIDC standard, or there might be a security issue + /// Mitigation + /// Use a different authority. If you are absolutely sure that you can trust the authority + /// you can use the passing + /// the validateAuthority parameter to false (not recommended) /// public const string AuthorityValidationFailed = "authority_validation_failed"; /// /// Invalid owner window type. + /// What happens? + /// You used "AcquireTokenInteractiveParameterBuilder.WithParentActivityOrWindow(object) + /// but the parameter you passed is invalid. + /// Remediation + /// On .NET Standard, the expected object is an Activity on Android, a UIViewController on iOS, + /// a NSWindow on MAC, and a IWin32Window or IntPr on Windows. + /// If you are in a WPF application, you can use WindowInteropHelper(wpfControl).Handle to get the window + /// handle associated with a WPF control /// public const string InvalidOwnerWindowType = "invalid_owner_window_type"; + // TODO: InvalidServiceUrl does not seem to be used anywhere? + /// /// Invalid service URL. /// @@ -164,9 +202,14 @@ public static class MsalError /// /// Encoded token too long. + /// What happens + /// In a confidential client application call, the client assertion built by MSAL is longer than + /// the max possible length for a JWT token. /// public const string EncodedTokenTooLong = "encoded_token_too_long"; + // TODO: does not seem to be used in MSAL.NET + /// /// No data from STS. /// @@ -179,21 +222,41 @@ public static class MsalError /// /// Failed to refresh token. + /// What happens? + /// The token could not be refreshed. This can be because the user has not used the application for a long time. + /// and therefore the refresh token maintained in the token cache has expired + /// Mitigation + /// If you are in a public client application, that supports interactivity, send an interactive request + /// . Otherwise, + /// use a different method to acquire tokens. /// public const string FailedToRefreshToken = "failed_to_refresh_token"; /// /// Failed to acquire token silently. Used in broker scenarios. + /// What happens + /// you called + /// or and your + /// mobile (Xamarin) application leverages the broker (Microsoft Authenticator or Microsoft Company Portal), but the broker + /// was not able to acquire the token silently. + /// Mitigation + /// Call /// public const string FailedToAcquireTokenSilentlyFromBroker = "failed_to_acquire_token_silently_from_broker"; /// /// RedirectUri validation failed. + /// What happens? + /// The redirect URI / reply URI is invalid + /// How to fix + /// Pass a valid redirect URI. /// public const string RedirectUriValidationFailed = "redirect_uri_validation_failed"; /// - /// The request could not be preformed because of an unknown failure in the UI flow. + /// The request could not be preformed because of an unknown failure in the UI flow.* + /// Mitigation + /// Inform the user. /// public const string AuthenticationUiFailed = "authentication_ui_failed"; @@ -204,11 +267,20 @@ public static class MsalError /// /// Accessing WS Metadata Exchange Failed. + /// What happens? + /// You tried to use + /// and the account is a federated account. + /// Mitigation + /// None. The WS metadata was not found or does not correspond to what was expected. /// public const string AccessingWsMetadataExchangeFailed = "accessing_ws_metadata_exchange_failed"; /// /// Federated service returned error. + /// Mitigation + /// None. The federated service returned an error. You can try to look at the + /// Body of the exception for a better understanding of the error and choose + /// the mitigation /// public const string FederatedServiceReturnedError = "federated_service_returned_error"; @@ -233,17 +305,29 @@ public static class MsalError public const string WsTrustEndpointNotFoundInMetadataDocument = "wstrust_endpoint_not_found"; /// - /// Parsing WS-Trust Response Failed. + /// You can get this error when using + /// In the case of a Federated user (that is owned by a federated IdP, as opposed to a managed user owned in an Azure AD tenant) + /// ID3242: The security token could not be authenticated or authorized. + /// The user does not exist or has entered the wrong password /// public const string ParsingWsTrustResponseFailed = "parsing_wstrust_response_failed"; /// - /// Unknown User Type. + /// What happens + /// You can get this error when using + /// The user is not recognized as a managed user, or a federated user. Azure AD was not + /// able to identify the IdP that needs to process the user + /// Mitigation + /// Inform the user. the login that the user provided might be incorrect. /// public const string UnknownUserType = "unknown_user_type"; /// - /// Unknown User. + /// What happens + /// You can get this error when using + /// The user is not known by the IdP + /// Mitigation + /// Inform the user. The login that the user provided might be incorrect (for instance empty) /// public const string UnknownUser = "unknown_user"; @@ -254,21 +338,43 @@ public static class MsalError /// /// Password is required for managed user. + /// What happens? + /// If can got this error when using + /// and you (or the user) did not provide a password. /// public const string PasswordRequiredForManagedUserError = "password_required_for_managed_user"; /// /// Request is invalid. + /// What happens? + /// This can happen because you are using a token acquisition method which is not compatible with the authority. For instance: + /// you called + /// but you used an authority ending with '/common' or '/consumers' as this requires a tenanted authority or '/organizations'. + /// Mitigation + /// Adjust the authority to the AcquireTokenXX method you use (don't use 'common' or 'consumers' with + /// /// public const string InvalidRequest = "invalid_request"; /// /// Cannot access the user from the OS (UWP) + /// What happens + /// You called , but the domain user + /// name could not be found. + ///Mitigation + /// This might be because you need to add more capabilities to your UWP application in the Package.appxmanifest. + /// See https://aka.ms/msal-net-uwp /// public const string UapCannotFindDomainUser = "user_information_access_failed"; /// /// Cannot get the user from the OS (UWP) + /// What happens + /// You called , but the domain user + /// name could not be found. + ///Mitigation + /// This might be because you need to add more capabilities to your UWP application in the Package.appxmanifest. + /// See https://aka.ms/msal-net-uwp /// public const string UapCannotFindUpn = "uap_cannot_find_upn"; @@ -278,10 +384,11 @@ public static class MsalError public const string NonParsableOAuthError = "non_parsable_oauth_error"; /// + /// What happens? /// In the context of Device code flow (See https://aka.ms/msal-net-device-code-flow), /// this error happens when the device code expired before the user signed-in on another device (this is usually after 15 mins). - /// - /// Mitigation: None. Inform the user that they took too long to sign-in at the provided URL and enter the provided code. + /// Mitigation + /// None. Inform the user that they took too long to sign-in at the provided URL and enter the provided code. /// public const string CodeExpired = "code_expired"; @@ -292,7 +399,8 @@ public static class MsalError /// /// TODO: UPDATE DOCUMENTATION! - /// On Android, the UIParent constructor with an Activiy parameter must be used. See https://aka.ms/msal-interactive-android + /// On Android, you need to call AcquireTokenInteractiveParameterBuilder.WithParentActivityOrWindow(object) passing + /// the activity. See https://aka.ms/msal-interactive-android /// public const string ActivityRequired = "activity_required"; @@ -326,7 +434,7 @@ public static class MsalError public const string HttpStatusCodeNotOk = "http_status_not_200"; /// - /// Error code used when the CustomWebUI has returned an uri, but it is invalid - it is either null or has no code. + /// Error code used when the has returned an uri, but it is invalid - it is either null or has no code. /// Consider throwing an exception if you are unable to intercept the uri containing the code. /// public const string CustomWebUiReturnedInvalidUri = "custom_webui_returned_invalid_uri"; @@ -337,13 +445,18 @@ public static class MsalError /// public const string CustomWebUiRedirectUriMismatch = "custom_webui_invalid_mismatch"; + // TODO: does not seem to be used? + /// /// Access denied. /// public const string AccessDenied = "access_denied"; /// - /// Cannot Access User Information or User is Not Domain Joined. + /// Cannot Access User Information or the user is not a user domain. + /// What happens? + /// You tried to use + /// but the user is not a domain user (the machine is not domain or AAD joined) /// public const string CannotAccessUserInformationOrUserNotDomainJoined = "user_information_access_failed"; @@ -354,13 +467,15 @@ public static class MsalError /// /// No Redirect URI. + /// What happens? + /// You need to provide a Reply URI / Redirect URI, but have not called /// public const string NoRedirectUri = "no_redirect_uri"; /// /// Multiple Tokens were matched. /// What happens?This exception happens in the case of applications managing several identitities, - /// when calling + /// when calling /// or one of its overrides and the user token cache contains multiple tokens for this client application and the the specified Account, but from different authorities. /// Mitigation [App Development]specify the authority to use in the acquire token operation /// diff --git a/src/Microsoft.Identity.Client/MsalServiceException.cs b/src/Microsoft.Identity.Client/MsalServiceException.cs index 3b9aa7683c..d686e27912 100644 --- a/src/Microsoft.Identity.Client/MsalServiceException.cs +++ b/src/Microsoft.Identity.Client/MsalServiceException.cs @@ -193,11 +193,10 @@ internal OAuth2ResponseBase OAuth2Response /// provide additional claims, such as doing two factor authentication. The are two cases: /// /// - /// If your application is a , you should just call an override of - /// in having an extraQueryParameter argument, and add the following string $"claims={ex.Claims}" - /// to the extraQueryParameters, where ex is an instance of this exception. + /// If your application is a , you should just call + /// and add the modifier. /// - /// >If your application is a , (therefore doing the On-Behalf-Of flow), you should throw an Http unauthorize + /// >If your application is a , (therefore doing the On-Behalf-Of flow), you should throw an Http unauthorize /// exception with a message containing the claims /// /// For more details see https://aka.ms/msal-net-claim-challenge diff --git a/src/Microsoft.Identity.Client/MsalUiRequiredException.cs b/src/Microsoft.Identity.Client/MsalUiRequiredException.cs index aa276b19bf..f19e13aecc 100644 --- a/src/Microsoft.Identity.Client/MsalUiRequiredException.cs +++ b/src/Microsoft.Identity.Client/MsalUiRequiredException.cs @@ -31,7 +31,7 @@ namespace Microsoft.Identity.Client { /// /// This exception class is to inform developers that UI interaction is required for authentication to - /// succeed. It's thrown when calling or one + /// succeed. It's thrown when calling or one /// of its overrides, and when the token does not exists in the cache, or the user needs to provide more content, or perform multiple factor authentication based /// on Azure AD policies, etc.. /// For more details, see https://aka.ms/msal-net-exceptions diff --git a/src/Microsoft.Identity.Client/Prompt.cs b/src/Microsoft.Identity.Client/Prompt.cs index 22ca66aa0c..456f95abaf 100644 --- a/src/Microsoft.Identity.Client/Prompt.cs +++ b/src/Microsoft.Identity.Client/Prompt.cs @@ -29,7 +29,7 @@ namespace Microsoft.Identity.Client { /// /// Structure containing static members that you can use to specify how the interactive overrides - /// of AcquireTokenAsync in should prompt the user. + /// of AcquireTokenAsync in should prompt the user. /// /// Prompt is the result of renaming, in MSAL 3.0.0, the UIBehavior structure /// which was in MSAL 2.x @@ -121,4 +121,4 @@ public override int GetHashCode() return !(x == y); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Identity.Client/UserAssertion.cs b/src/Microsoft.Identity.Client/UserAssertion.cs index f201f93c4a..660d381f24 100644 --- a/src/Microsoft.Identity.Client/UserAssertion.cs +++ b/src/Microsoft.Identity.Client/UserAssertion.cs @@ -41,8 +41,7 @@ namespace Microsoft.Identity.Client /// See https://aka.ms/msal-net-on-behalf-of /// #if DESKTOP || NET_CORE || NETSTANDARD1_3 - /// - /// and + /// #endif public sealed class UserAssertion #pragma warning restore CS1587 // XML comment is not placed on a valid language element @@ -98,4 +97,4 @@ public UserAssertion(string assertion, string assertionType) internal string AssertionHash { get; set; } } -} \ No newline at end of file +}