当我使用
@attribute [Authorize]
Run Code Online (Sandbox Code Playgroud)
在 blazor 客户端应用程序的剃刀页面上,它给了我这个错误
System.InvalidOperationException:无法为“Microsoft.AspNetCore.Components.PageDisplay+AuthorizeViewWithSuppliedData”类型的属性“AuthorizationPolicyProvider”提供值。没有“Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider”类型的注册服务
我AuthenticationStateProvider为客户端设置了身份验证并使用自定义如下
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<AuthenticationStateProvider, ApiAuthenticationStateProvider>();
services.AddSingleton<AuthService, AuthService>();
services.AddBlazoredLocalStorage();
}
public void Configure(IComponentsApplicationBuilder app)
{
app.AddComponent<App>("app");
}
}
Run Code Online (Sandbox Code Playgroud)
对这个问题的任何帮助
我正在尝试将 api url 保存在 appsettings 中。但是,configuration.Propertiers 似乎是空的。我不确定如何获得设置。在 program.cs 中:
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
//string url = builder.Configuration.Properties["APIURL"].ToString();
foreach (var prop in builder.Configuration.Properties)
Console.WriteLine($"{prop.Key} : {prop.Value}" );
//builder.Services.AddSingleton<Service>(new Service(url));
builder.RootComponents.Add<App>("app");
await builder.Build().RunAsync();
}
Run Code Online (Sandbox Code Playgroud) 我有一个 Blazor WebAssembly 解决方案,其中包含客户端项目、服务器项目和共享项目,基于 Microsoft 的默认解决方案模板。我正在使用 Google Chrome 在 Visual Studio 2019 预览版中进行编辑和调试。
该解决方案开箱即用,只有一个启动项目,即服务器应用程序。该服务器应用程序具有对客户端应用程序的项目引用。您可以通过在服务器项目属性中选中“启用 SSL”来将其设置为使用 HTTPS,我已经这样做了。
当您单击调试时,它可以完美运行。
现在我想更改它,以便 Blazor WASM 应用程序仅响应来自https://localhost:44331 的请求,而不响应对https://localhost:44331/api 的请求。这些请求应该由服务器应用程序的 API 控制器端点处理。因此,如果有人访问https://localhost:44331/api/something,并且不存在这样的 API 端点,他们应该从 API 收到 404 错误代码,并且不会被路由到通常的 Blazor 页面说“对不起,没有任何东西在这个地址。”
我想使用 URL 的这个额外的“/api”部分来保持对 API 的请求与对页面的请求分开。我认为这将更接近生产中的正常设置。我希望很清楚我要做什么。
这是一个带有路由属性的示例控制器声明:
namespace BlazorApp2.Server.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
// Etc.
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
//etc.
}
///etc.
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在 Startup.cs 中尝试过的,但它不起作用。任何人都可以提出一些取悦的建议吗?
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Etc. …Run Code Online (Sandbox Code Playgroud) iis-express asp.net-core blazor asp.net-core-staticfile blazor-client-side
我已经将我的问题归结为样板 Blazor Web Assembly 应用程序。
该项目直接来自向导,添加了以下代码。
@page "/"
@inject IJSRuntime JSRuntime;
@using System.Drawing;
@using System.IO;
<div>
<h1>Video Test</h1>
</div>
<video id="video" width="640" height="480" autoplay></video>
<div>
<button type="button" class="btn btn-primary" @onclick="StartVideo">Click Me</button>
</div>
@code {
async Task StartVideo()
{
await JSRuntime.InvokeVoidAsync("startVideo");
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个像这样附加的 JavaScript 页面:
function startVideo() {
alert("Test Alert!");
var video = document.getElementById('video');
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({ video: true }).then(function (stream) {
video.src = window.URL.createObjectURL(stream);
video.srcObject = stream;
video.play();
});
}
}
Run Code Online (Sandbox Code Playgroud)
该应用程序编译没有问题。当我运行它并单击按钮时,我收到警报。我添加到警报以确认 Java …
在 Blazor webassembly 中,有一种方法可以强制对 httpclient 和 GetJsonAsync、PostAsJsonAsync 等方法使用 Newtonsoft.Json 序列化。
或者唯一的方法是编写辅助方法并使用 GetAsync,然后使用 Newtonsoft.Json 手动序列化响应?
我有一个嵌套 div 的问题,它们都有 onmouseover/onmouseout 事件。我有一个导航菜单,它从 onmouseover 事件触发的屏幕一侧弹出。在这个导航菜单中,我有一个弹出打开的子菜单,它也是由 onmouseover 事件触发的。两个打开事件独立工作正常,但是当一起运行时,触发器似乎被外部 div 拦截(外部 div 打开但内部 div 什么也不做)。
如果有我错过的技巧,请告诉我。代码如下(省略了 c# 代码 - 相应地修改了 collapseNavicationFlag 和 ExpandSubmenu 标志字符串。)
导航菜单
<div id="nav-bar" class="@collapseNavigationFlag" @onmouseover="ExpandNavigation" @onmouseout="CollapseNavigation">
<div>
<ul class="nav flex-column">
foreach (var navigationItem in navigationSection.NavigationItems)
{
<NavMenuSubmenu />
}
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
导航菜单子菜单
<li>
<ul class="nav-submenu @expandSubmenu"
@onmouseover="ExpandSubmenu"
@onmouseout="CollapseSubmenu">
@foreach (var navigationSubItem in NavigationItem.NavigationSubItems)
{
<li class="nav-submenu-item px-3">
<a href="@navigationSubItem.Page"> …Run Code Online (Sandbox Code Playgroud) 我有一个延迟加载的程序集,其中包含需要使用内置依赖注入实现注册的服务。如何注册这些服务,以便可以通过正常的注入机制将它们作为依赖项注入到延迟加载的程序集包含的组件中。
我在 blazor 中有一个 InputText,我想阻止非数字字符,执行此操作的基本 razor 和 C# 代码是什么?这就是我需要它工作的方式,用户输入一个字符,它会拒绝输入所有内容并显示一条验证消息,说明只允许使用数字。到目前为止,我已经尝试使用正则表达式的数据表示法范围属性,但这并不拒绝非数字字符。
blazor blazor-server-side blazor-client-side asp.net-blazor blazor-webassembly
我创建了一个 Asp.Net Core 托管的 Blazor webassembly 3.2.0 Preview 3 应用程序,其中包含应用程序内帐户的身份验证选项。然后我向 ApplicationUser 类添加了一些额外的属性,并将这些更改迁移到数据库。然后我实现了一个自定义声明工厂,如下所示:
public class MyCustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public MyCustomUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, optionsAccessor)
{
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
var identity = await base.GenerateClaimsAsync(user);
identity.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName ?? string.Empty));
.....
return identity;
}
}
Run Code Online (Sandbox Code Playgroud)
并在服务器应用程序中注册声明工厂,如下所示:
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddClaimsPrincipalFactory<MyCustomUserClaimsPrincipalFactory>();
Run Code Online (Sandbox Code Playgroud)
但是,当我在客户端 Web 应用程序组件中列出声明时,我没有看到我在自定义声明工厂中添加的任何其他声明。我用来列出索赔的代码是:
<AuthorizeView>
<Authorized>
<ul>
@foreach (var claim in context.User.Claims)
{
<li><span>@claim.Type</span><span>@claim.Value</span></li>
}
</ul>
</Authorized>
</AuthorizeView>
Run Code Online (Sandbox Code Playgroud)
我确认正在调用声明工厂代码。如何在客户端 Web 应用程序中获取其他声明?
编辑:我甚至用ClaimsTransformer(如建议尝试 …
我有一个带有 blazor 客户端组件(webassembly/WASM)的正常运行的网站。然后我尝试在谷歌上为该网站做广告,但被不需要的软件拒绝了。我查看了我的网站,在 wwwroot 中当然有一个 _bin_framework 目录,其中包含下载到客户端浏览器的 dll。
这可能是问题吗?什么可能是解决方法?或者,是否有人有 blazor WASM 网站的示例,这些网站是谷歌广告的成功目标,可能证明 Blazor DLL 不是问题,而其他可能是问题?
(事实上,任何关于如何处理谷歌拒绝垃圾软件的一般建议都非常感谢!)