我已经使用 Microsoft Entra 在 Blazor 中设置了身份验证,效果很好。然而,我需要更多的声明,并在 Entra 中添加了另外三个声明:
但是当我查看代码中的用户声明时,它们没有出现。我只收到 8 个默认索赔。在我的 Program.cs 中,我像这样设置身份验证:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options =>
{
IConfigurationSection section = builder.Configuration.GetSection("AzureAd");
string? instance = section["Instance"];
ArgumentException.ThrowIfNullOrWhiteSpace(instance);
options.Instance = instance;
string? domain = section["Domain"];
ArgumentException.ThrowIfNullOrWhiteSpace(domain);
options.Domain = domain;
string? tenantId = section["TenantId"];
ArgumentException.ThrowIfNullOrWhiteSpace(tenantId);
options.TenantId = tenantId;
string? clientId = section["ClientId"];
ArgumentException.ThrowIfNullOrWhiteSpace(clientId);
options.ClientId = clientId;
string? callbackPath = section["CallbackPath"];
ArgumentException.ThrowIfNullOrWhiteSpace(callbackPath);
options.CallbackPath = callbackPath;
});
我对身份验证不是很了解,但我认为我应该为我的身份验证提供范围,但我找不到这样做的方法。
首先,我可以在测试中获得
ctry
声明,但无法获得verified_primary_email
声明。恐怕这是因为我的测试用户对此声明没有价值。
这就是我在我身边所做的。首先,我们需要确保该声明确实存在于 id 令牌或访问令牌中。因为用户声明来自 ID 令牌,所以我使用 Id 令牌进行测试。我使用此链接(Azure AD 身份验证代码流)来获取 id 令牌。请使用您在 Azure AD 身份验证刀片中设置的重定向 URL。
https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize?
client_id=client_id
&response_type=code id_token
&redirect_uri=http://localhost/myapp/
&response_mode=fragment
&scope=user.read openid offline_access
&state=12345
&nonce=abcde
在浏览器中访问该 url 会要求您登录,然后您将在 url 字段中获取访问令牌。该网址如下所示。请复制并解码 id 令牌。您会看到有
ctry
声明。
接下来让我们将 Azure AD 集成到您的应用程序中。如果您已经能够使用 Microsoft 帐户登录 blazor 服务器应用程序,则可以忽略此步骤。如果没有,您可以通过 VS 创建新的 blazor 服务器应用程序,但请将身份验证类型选择为
Microsoft identity platform
。然后您只需使用 AAD 属性修改 appsettings.json 即可。您现在可以运行 blazor 服务器应用程序,并且您将能够使用您的 Microsoft 帐户登录。
接下来是获取索赔。将以下代码添加到 Index.razor 中,您将看到结果。
@page "/"
@inject AuthenticationStateProvider AuthenticationStateProvider
@using System.Security.Claims
<ul>
@foreach (var claim in claims)
{
<li>@claim.Type: @claim.Value</li>
}
</ul>
@code{
private IEnumerable<Claim> claims;
protected override async Task OnInitializedAsync()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
claims = user.Claims;
}
}
}