У меня есть работающий веб-сайт .NET Core 3.0 MVC, использующий AzureAD для аутентификации, все это прекрасно работает. Я начал переносить некоторые интерфейсные страницы в Blazor (в том же проекте), но не могу заставить аутентификацию работать.
Я добавил тег @attribute [Authorize] в верхнюю часть Index.razor, ноЯ не перенаправляюсь в Azure для входа в систему, как при добавлении в стандартный контроллер ASP.NET MVC.
Startup.ConfigureServices
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
Configuration.GetSection("OpenIdConnect").Bind(options);
});
services.AddAuthorizationCore(options =>
{
options.AddPolicy(Policies.AccessRole, Policies.IsAccessPolicy());
options.AddPolicy(Policies.AdminRole, Policies.IsAdminPolicy());
});
Startup.Configure
app.UseAuthentication();
app.UseAuthorization();
Index.razor
@page "/"
@attribute [Authorize(Policy = Policies.AccessRole)]
Политики
public static class Policies
{
public const string AccessRole = "Access";
public const string AdminRole = "Admin";
public static AuthorizationPolicy IsAccessPolicy()
{
return new AuthorizationPolicyBuilder().RequireAuthenticatedUser()
.RequireRole(AccessRole)
.Build();
}
public static AuthorizationPolicy IsAdminPolicy()
{
return new AuthorizationPolicyBuilder().RequireAuthenticatedUser()
.RequireRole(AdminRole)
.Build();
}
}
Если я перехожу на страницу MVC, я аутентифицируюсь с помощью AzureAD, а затем возвращаюсь на страницу Blazor и могуиспользуйте следующее успешно
<AuthorizeView Policy="@Policies.AccessRole">
<p>Is in Access policy.</p>
</AuthorizeView>
<AuthorizeView Policy="@Policies.AdminRole">
<p>Is in Admin policy.</p>
</AuthorizeView>
Итак, для подведения итогов, моя страница Blazor не выдает автоматически вызов auth при использовании атрибута [Authorize].
Кто-нибудь знает, что я делаю неправильно?
Обновление
Это как задумано https://github.com/aspnet/AspNetCore/issues/13709
В качестве обходного пути я добавил компонент для перенаправления на страницу входа
App.razor
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<AuthChallenge></AuthChallenge>
</NotAuthorized>
</AuthorizeRouteView>
</Found>
<NotFound>
<CascadingAuthenticationState>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</CascadingAuthenticationState>
</NotFound>
</Router>
AuthCallenge.razor
@inject NavigationManager Navigation
@code {
protected override void OnInitialized()
{
Navigation.NavigateTo("/Account/SignIn", true);
}
}