-
Notifications
You must be signed in to change notification settings - Fork 39
Add doc about linux broker on dotnet scenario #646
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
c631925
ffa809e
83ccb15
2be64ed
3c184e4
e30b448
182fe07
e425098
d0b2baf
2099411
2fca0c8
17e2eb3
ae7f038
269356c
82e796f
5907d42
2e29b6e
c973e74
871cfdd
82d1694
b65ae78
528ab4a
1cd63df
e07e91f
d83a3a4
384f135
837040d
4a28d7e
fe81a0e
bac9b31
d1bee1e
904d17c
ee47017
23e7903
934edbc
ddffeae
749cb8d
65ce187
b5c37a3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,149 @@ | ||||||||
--- | ||||||||
# Required metadata | ||||||||
# For more information, see https://review.learn.microsoft.com/en-us/help/platform/learn-editor-add-metadata?branch=main | ||||||||
# For valid values of ms.service, ms.prod, and ms.topic, see https://review.learn.microsoft.com/en-us/help/platform/metadata-taxonomies?branch=main | ||||||||
|
||||||||
title: Use MSAL.NET with an authentication broker on Linux | ||||||||
description: "Learn how to use MSAL.NET with a broker on the Linux platform." | ||||||||
author: xinyuxu1026 # GitHub alias | ||||||||
ms.author: xinyuxu # Microsoft alias | ||||||||
ms.service: msal | ||||||||
# ms.prod: # To use ms.prod, uncomment it and delete ms.service | ||||||||
ms.topic: how-to | ||||||||
ms.date: 05/05/2025 | ||||||||
--- | ||||||||
|
||||||||
# Use MSAL.NET with an authentication broker on Linux | ||||||||
|
||||||||
|
||||||||
> [!NOTE] | ||||||||
> Microsoft single sign-on (SSO) for Linux authentication broker support is introduced with `Microsoft.Identity.Client` version v4.69.1. | ||||||||
|
||||||||
Using an authentication broker on Linux enables you to simplify how your users authenticate with Microsoft Entra ID from your application, as well as take advantage of future functionality that protects Microsoft Entra ID refresh tokens from exfiltration and misuse. | ||||||||
xinyuxu1026 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
|
||||||||
An authentication broker is **not** pre-installed on standalone Linux but is bundled as a dependency of applications developed by Microsoft, such as [Company Portal](/mem/intune-service/user-help/enroll-device-linux). These applications are usually installed when a Linux computer is enrolled in a company's device fleet via an endpoint management solution like [Microsoft Intune](/mem/intune/fundamentals/what-is-intune). For [Windows Subsystem for Linux](/windows/wsl/about) (WSL) scenario, WAM (Windows Account Manager) is used as the broker. WAM does come pre-installed on the Windows system. To learn more about Linux device set up with the Microsoft Identity Platform, see [Microsoft Enterprise SSO plug-in for Apple devices](/entra/identity-platform/apple-sso-plugin). | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Could you clarify how this doc for Apple devices is helpful for Linux machines? |
||||||||
|
||||||||
## Prerequisites | ||||||||
|
||||||||
MSAL.NET project requires .NET version greater or equal than the version specified in [global.json](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/blob/main/global.json) file, we recommend register the Microsoft package repository and install .NET, please follow the instructions here: [Install .NET on Ubuntu](/dotnet/core/install/linux-ubuntu-decision#register-the-microsoft-package-repository). And please make sure you have all the [.NET required dependencies](/dotnet/core/install/linux-ubuntu-decision#dependencies) installed. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It isn't clear to me why I should care about what the MSAL.NET project requires. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I like the part in which it recommends registering the Microsoft Package Repo and install .NET from it, cause Ubuntu has its own feed and it took me a while to install net8.0.4. |
||||||||
|
||||||||
To use the broker, you'll need to install a list of dependencies on the Linux platform: | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should also note/link to the user on the fact that dotnet is required to be installed for the sample. Perhaps we can consolidate a "prep step" that calls out below: sudo apt install seahorse libx11-dev There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hi Justin, I added the .net installation part and the version requirement, could you help take a look again? Thanks |
||||||||
|
||||||||
```bash | ||||||||
xinyuxu1026 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
libc++-dev | ||||||||
libc++abi-dev | ||||||||
libsecret-tools | ||||||||
libwebkit2gtk-4.0-dev | ||||||||
``` | ||||||||
|
||||||||
On Debian-based distributions, run this command to install dependencies: | ||||||||
```bash | ||||||||
sudo apt install libc++-dev libc++abi-dev libsecret-tools libwebkit2gtk-4.0-dev - y | ||||||||
``` | ||||||||
|
||||||||
## Create a console app on Linux platform | ||||||||
xinyuxu1026 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
|
||||||||
To use a broker on the Linux platform, set the `BrokerOptions` to `OperatingSystems.Linux`. Notice that we use the same option for both Windows Subsystem for Linux (WSL) and standalone Linux. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||
|
||||||||
```csharp | ||||||||
using Microsoft.Identity.Client; | ||||||||
using Microsoft.Identity.Client.Broker; | ||||||||
|
||||||||
class Program | ||||||||
{ | ||||||||
public static string ClientID = "your client id"; //msidentity-samples-testing tenant | ||||||||
public static string[] Scopes = { "User.Read" }; | ||||||||
static void Main(string[] args) | ||||||||
{ | ||||||||
xinyuxu1026 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
IPublicClientApplication pcaBuilder = PublicClientApplicationBuilder.Create(ClientID) | ||||||||
.WithAuthority("https://login.microsoftonline.com/common") | ||||||||
.WithDefaultRedirectUri() | ||||||||
.WithBroker(new BrokerOptions(BrokerOptions.OperatingSystems.Linux) | ||||||||
{ | ||||||||
ListOperatingSystemAccounts = true, | ||||||||
MsaPassthrough = true, | ||||||||
Title = "MSAL WSL Test App" | ||||||||
}) | ||||||||
.Build(); | ||||||||
|
||||||||
AcquireTokenInteractiveParameterBuilder atParamBuilder = pcaBuilder.AcquireTokenInteractive(Scopes); | ||||||||
|
||||||||
AuthenticationResult authenticationResult = atParamBuilder.ExecuteAsync().GetAwaiter().GetResult(); | ||||||||
Console.WriteLine(authenticationResult.AccessToken); | ||||||||
} | ||||||||
} | ||||||||
``` | ||||||||
|
||||||||
xinyuxu1026 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
## Sample App | ||||||||
A sample application is available for developers who want to try the authentication broker on Linux. The application is located [in the MSAL.NET GitHub repository](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/tree/main/tests/devapps/WAM/NetWSLWam). The app has a dependency of `libx11-dev` package. | ||||||||
|
||||||||
On Debian-based distributions, run `sudo apt install libx11-dev` to install the package. The `libx11` library is used to get the console window handle on Linux. Here's the sample code to use `libx11` to get the window handle: | ||||||||
|
||||||||
```csharp | ||||||||
using System; | ||||||||
using System.Runtime.InteropServices; | ||||||||
|
||||||||
class X11Interop | ||||||||
{ | ||||||||
[DllImport("libX11")] | ||||||||
public static extern IntPtr XOpenDisplay(IntPtr display); | ||||||||
|
||||||||
[DllImport("libX11")] | ||||||||
public static extern IntPtr XDefaultRootWindow(IntPtr display); | ||||||||
|
||||||||
public static void Main() | ||||||||
{ | ||||||||
IntPtr display = XOpenDisplay(IntPtr.Zero); | ||||||||
if (display == IntPtr.Zero) | ||||||||
{ | ||||||||
Console.WriteLine("Unable to open X display."); | ||||||||
return; | ||||||||
} | ||||||||
|
||||||||
IntPtr rootWindow = XDefaultRootWindow(display); | ||||||||
Console.WriteLine($"Root window handle: {rootWindow}"); | ||||||||
} | ||||||||
} | ||||||||
``` | ||||||||
localden marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
|
||||||||
We recommend play with the sample app using your client id. To run the sample app, use the following command: | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||
```dotnetcli | ||||||||
dotnet run --project tests\devapps\WAM\NetWSLWam\test.csproj | ||||||||
``` | ||||||||
|
||||||||
## WSL Scenario | ||||||||
|
||||||||
### Update to the latest version of WSL | ||||||||
|
||||||||
Enure you have updated to the latest WSL release. The WAM Account Control dialog is supported in WSL versions 2.4.13 and above. Using the broker isn't possible with earlier versions. To check the WSL version, use the following command: | ||||||||
|
||||||||
```powershell | ||||||||
wsl --version | ||||||||
``` | ||||||||
localden marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
|
||||||||
To update WSL, run the following command from Windows Terminal: | ||||||||
|
||||||||
```powershell | ||||||||
wsl --update | ||||||||
``` | ||||||||
|
||||||||
### Set up Keyring in WSL | ||||||||
MSAL uses `libsecret` on Linux. It is required to communicate with the `keyring` daemon. Users can use [Seahorse](https://wiki.gnome.org/Apps/Seahorse/) (a GNOME application for managing encryption keys and passwords) to manage the `keyring` contents through a Graphical User Interface (GUI). | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It could be helpful to add more details on how Keyring plays a role with the library and WAM. Keyring might be confused with WAM in some way. |
||||||||
|
||||||||
On Debian-based distributions, you can install the package by running `sudo apt install seahorse` and then following these instructions: | ||||||||
|
||||||||
1. Run `seahorse` in the terminal. | ||||||||
2. In the top left corner, click **+** and create **Password** keyring. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||
|
||||||||
 | ||||||||
|
||||||||
3. Create a keyring named 'login' and set the password. | ||||||||
|
||||||||
 | ||||||||
|
||||||||
 | ||||||||
|
||||||||
 | ||||||||
|
||||||||
4. Run `wsl.exe --shutdown` from your Windows Terminal. | ||||||||
5. Start a new WSL session and run the sample. You should be asked for the keyring password. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this note should be removed. Instead, add the following .NET CLI commands to the Prereqs section below with minimum required versions:
dotnet add package Microsoft.Identity.Client
dotnet add package Microsoft.Identity.Client.Broker