【发布时间】:2021-07-31 03:17:27
【问题描述】:
我有一个在 webassembly blazor 中开发并受 Azure AD 保护的客户端应用程序,其中定义了它的注册角色和 3 个角色并将其分配给用户。
一旦用户登录,用户将被重定向到显示声明集的个人资料页面
Claim Type Value
oid 091fadf9-b0bd-4583-b55d-XXXX
preferred_username XX
roles ["Administrator"]
将根据用户角色显示不同的 UI,但这不起作用
<AuthorizeView Roles="Administrator">
ADMIN UI
</AuthorizeView>
我的程序类如下所示:
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
//builder.Logging.SetMinimumLevel(LogLevel.Debug);
////builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddScoped<CustomAuthorizationMessageHandler>();
builder.Services.AddHttpClient("myAPI",
client => client.BaseAddress = new Uri("private API URL"))
.AddHttpMessageHandler<CustomAuthorizationMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
.CreateClient("myAPI"));
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add(myAPI);
options.UserOptions.RoleClaim = "roles";
});
await builder.Build().RunAsync();
}
我有一个受支持的用户类:
public class UserClaimsBase: ComponentBase
{
// AuthenticationStateProvider service provides the current user's ClaimsPrincipal data.
[Inject]
private AuthenticationStateProvider AuthenticationStateProvider { get; set;
}
protected string _authMessage;
protected IEnumerable<Claim> _claims = Enumerable.Empty<Claim>();
// Defines list of claim types that will be displayed after successfull sign-in.
private string[] returnClaims = { "name", "preferred_username", "tid", "oid", "roles" };
protected override async Task OnInitializedAsync()
{
await GetClaimsPrincipalData();
}
/// <summary>
/// Retrieves user claims for the signed-in user.
/// </summary>
/// <returns></returns>
private async Task GetClaimsPrincipalData()
{
// Gets an AuthenticationState that describes the current user.
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
// Checks if the user has been authenticated.
if (user.Identity.IsAuthenticated)
{
_authMessage = $"{user.Identity.Name} is authenticated.";
// Sets the claims value in _claims variable.
// The claims mentioned in returnClaims variable are selected only.
_claims = user.Claims.Where(x => returnClaims.Contains(x.Type));
}
else
{
_authMessage = "The user is NOT authenticated.";
}
}
}
这里可能有什么问题? 我不确定我错过了什么? 任何帮助表示赞赏。
【问题讨论】:
标签: .net-core azure-active-directory blazor-webassembly user-roles azure-rbac