这让我发疯了多年。我拿了以下工作代码
<input @onchange="@((ui) => Console.WriteLine(ui.Value))" />
Run Code Online (Sandbox Code Playgroud)
并将其复制到一个新的 blazor 组件项目中。然后我开始收到错误
error CS1660: Cannot convert lambda expression to type 'bool' because it is not a delegate type
我有两个应用程序,都运行在同一台 Windows 机器上。一个应用程序是 IdentityServer4,另一个是我自己的 Web 应用程序(服务器端 Blazor 应用程序)。
这两个 Web 应用程序都是使用 .NET Core 3.1 构建的。
当我导航到我的 Web 应用程序时,我首先被重定向到我的 IdentityServer4 应用程序。我登录,然后我被重定向回我的网络应用程序。
登录成功,因为IdentitServer的日志没有错误。此外,我claim在 Blazor 网页上看到了某个值。我这显示claim通过CascadingAuthenticationState我的Blazor页。通过那条路径,一切正常。
但是,每当我尝试HttpContext在我的“代码隐藏”文件中获取登录用户时,我都会返回一个 Null 引用。例如:
public UserService(IHttpContextAccessor httpContextAccessor)
{
// HttpClient is NULL...
var httpCtx = _httpContextAccessor.HttpClient;
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我在 Visual Studio 中本地运行我的应用程序时,一切正常。当我在 Visual Studio 中调试时,我看到HttpContext设置了我的所有用户数据。
但是,出于某种原因HttpContext,NULL当我从 IIS 运行应用程序时。
我该如何解决这个问题?
iis asp.net-core identityserver4 blazor-server-side .net-core-3.1
我试图在 Visual Studio 模板应用程序中通过 Blazor 获取 Asp.Net Identity 登录,它仍然使用 Razor Pages 和 MVC 登录,但只能让它在事件上工作OnInitAsync,这没有用,因为它需要在按钮点击时完成,而不是在页面加载时完成。
我的失败代码是
protected async Task LoginTest()
{
await _SignInManager.SignInAsync(new ApplicationUser()
{ UserName = "test@test.com" }, true);
UriHelper.NavigateTo("/", true);
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
System.InvalidOperationException: The response headers cannot be modified because the response has already started.
at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.ThrowIfReadOnly()
at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.set_Item(String key, StringValues value)
at Microsoft.AspNetCore.Http.Internal.ResponseCookies.Append(String key, String value, CookieOptions options)
at Microsoft.AspNetCore.Authentication.Cookies.ChunkingCookieManager.AppendResponseCookie(HttpContext context, String key, String value, CookieOptions options)
at Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler.HandleSignInAsync(ClaimsPrincipal user, AuthenticationProperties properties)
at Microsoft.AspNetCore.Authentication.AuthenticationService.SignInAsync(HttpContext context, String …Run Code Online (Sandbox Code Playgroud) 我有一个简单的子 Blazor 组件(MyModal),如下所示:
<div class="modal">
<h3>@Title</h3>
@BodyTemplate
</div>
@code
{
[Parameter] string Title { get; set; }
[Parameter] RenderFragment BodyTemplate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的父组件中,我这样称呼它:
<MyModal Title="Super Cool Modal">
<BodyTemplate>
@MyObject.Name
</BodyTemplate>
</MyModal>
public MyObject MyObject { get; set; } = new MyObject();
Run Code Online (Sandbox Code Playgroud)
稍后在页面最初呈现后我更新,MyObject但引用的子组件本身@MyObject.Name永远不会更新。
似乎我必须在更新对象 ( StateHasChanged)后强制刷新子对象,但不确定如何使用此示例执行此操作。
如何在 Blazor 服务器端获取客户端信息,例如 IP 地址和浏览器名称/版本?
我正在尝试 Blazor ServerSide 并创建了一个组件以在用户未登录时重定向到登录页面。
@inject Microsoft.AspNetCore.Components.NavigationManager NavigationManager;
@code {
/// <inheritdoc />
protected override Task OnInitializedAsync()
{
NavigationManager.NavigateTo("Login");
return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)
}
但总是在调用“NavigateTo”时抛出以下异常:
"Microsoft.AspNetCore.Components.NavigationException: Exception of type 'Microsoft.AspNetCore.Components.NavigationException' was thrown.
at Microsoft.AspNetCore.Components.Server.Circuits.RemoteNavigationManager.NavigateToCore(String uri, Boolean forceLoad)
at Microsoft.AspNetCore.Components.NavigationManager.NavigateTo(String uri, Boolean forceLoad)
at ApplySupportTool.Blazor.Pages.RedirectToLogin.OnInitializedAsync() in C:\\Users\\padruttn\\Documents\\git\\ApplySupportTool\\src\\ApplySupportTool.Blazor\\Pages\\RedirectToLogin.razor:line 8"
Run Code Online (Sandbox Code Playgroud)
有趣的是,尽管有例外,还是进行了导航。我也尝试使用路径“/login”来调用它,但这里的行为相同。
如何在 SaveItem 事件中添加自定义验证消息(最好不要使用数据注释)?它应该显示在“ValidationMessage For=”上下文中。
@using System.ComponentModel.DataAnnotations
@page "/edititem"
<EditForm Model="@model" OnSubmit="@Submit" OnValidSubmit="@SaveItem">
<DataAnnotationsValidator />
<ValidationSummary />
<InputText id="ItemName" @bind-Value="@model.ItemName" />
<ValidationMessage For="@(() => model.ItemName)" />
<button type="submit">Submit</button>
</EditForm>
@code {
ItemModel model = new ItemModel();
private void Submit()
{
}
private void SaveItem()
{
}
public class ItemModel
{
[Required]
public string ItemName{ get; set; }
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个配置了 B2C 身份验证的 Blazor 服务器端应用程序。这个应用程序将调用一个 webapi 来与我的服务进行任何数据交换。B2C 身份验证工作正常,直接从模板配置 B2C 身份验证是:
services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(options => { Configuration.Bind("AzureAdB2C", options); });
Run Code Online (Sandbox Code Playgroud)
这些声明只有我从我的登录策略返回的声明,没有任何我可以用来代表我的 Web api 进行身份验证的访问令牌(也用同一个 B2C 租户保护)。
我已经阅读了大约 100 个不同的文档,但在 blazor 的上下文中似乎没有任何意义。有没有人以前做过这件事可以说明一些问题?
一等奖是在用户第一次向 B2C 进行身份验证后请求访问令牌,然后将令牌保存在缓存中,以便在会话/浏览器打开或访问令牌有效时在 blazor 应用程序中用于任何 api 调用。
似乎这是正确的路径:https : //github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi/blob/master/TaskWebApp/Controllers/TasksController.cs但我什么我不明白的是:
谢谢!
我的目标
我想创建一个新的 IdentityUser 并显示已通过同一个 Blazor 页面创建的所有用户。该页面有:
问题
当我通过表单 (1) 创建一个新用户时,我会收到以下并发错误:
InvalidOperationException:在上一个操作完成之前,在此上下文中启动了第二个操作。不保证任何实例成员都是线程安全的。
我认为问题与CreateAsync(IdentityUser user)和UserManager.Users指的是相同的 DbContext 的事实有关
该问题与第三方的组件无关,因为我重现了相同的问题,并用一个简单的列表替换了它。
重现问题的步骤
使用以下代码更改 Index.razor:
@page "/"
<h1>Hello, world!</h1>
number of users: @Users.Count()
<button @onclick="@(async () => await Add())">click me</button>
<ul>
@foreach(var user in Users)
{
<li>@user.UserName</li>
}
</ul>
@code {
[Inject] UserManager<IdentityUser> UserManager { get; set; }
IQueryable<IdentityUser> Users;
protected override void OnInitialized()
{
Users = UserManager.Users;
} …Run Code Online (Sandbox Code Playgroud)entity-framework-core asp.net-core blazor blazor-server-side
我想通过 Blazor 技术开发一个 SPA 项目。
由于调试 Blazor Web 程序集应用程序的复杂性,我想先将其创建为服务器端应用程序,然后再将其更改为 Web 程序集应用程序应用程序。
这可能吗?如果是这样,在我成功使服务器端 Blazor 项目工作后,我需要进行哪些更改才能获得与 WebAssembly 项目相同的功能?
另外,在我的服务器端 Blazor 项目中是否有任何我应该避免的特定方法或技术,因为它们在使用 WebAssembly 时没有等效项?