SignInManager没有的话可以使用吗HTTPContext?我正在制作 Blazor 服务器端应用程序,我需要让最终用户使用 的PasswordSignInAsync()方法登录SignInManager。
如果有其他方法可以用cookies或其他东西来做到这一点,我也会采用,只要它们是“干净”的方法。
如果我还能得到有关如何配置解决Startup.cs方案的解释,那就完美了。
我正在尝试使用本教程学习如何使用 Razor 页面制作 App.Net Core 应用程序:https ://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/model?view = aspnetcore-3.0&tabs=visual-studio
在我制作了 Movie 模型并成功搭建了它之后,我尝试进行数据库的初始迁移。
但是,每次我使用命令时Add-Migration,它只会提示ScriptHalted,即使使用详细选项时,与Update-Database.
我尝试了其他命令Enable-Migration,它们似乎有效,但不是我需要的两个。
有什么我想念的吗?
在我看来,我完美地遵循了教程,并试图在这里找到答案,但我没有想出任何解决方案。
我定义了一个LogInForm.cs这样的表格:
using System.ComponentModel.DataAnnotations;
namespace PollingInstitute.Data.LogIn
{
public class LogInForm
{
[Required]
[DataType(DataType.EmailAddress, ErrorMessage = "This field require a mail adress (example : abc@xyz.com)")]
public string Mail { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
和这样的登录屏幕LogIn.razor:
@page "/login"
@using PollingInstitute.Data.LogIn
@inject LogInService _LogInService
<h3>Login</h3>
<EditForm Model="@logInForm" OnValidSubmit="@TryLogIn">
<div>
<label>Mail Adress : </label><InputText @bind-Value="@logInForm.Mail"></InputText>
<ValidationMessage For="@(()=>logInForm.Mail)"></ValidationMessage>
</div>
<div>
<label>Password : </label><InputText @bind-Value="@logInForm.Password"></InputText>
<ValidationMessage For="@(()=>logInForm.Password)"></ValidationMessage>
</div>
<div>
@if (!IsDisabled)
{
<button type="submit">Submit</button> …Run Code Online (Sandbox Code Playgroud) 我正在做Blazor服务器端的项目,我想使一个按钮,desactivate点击后,却没有使用disabled的属性<button>。代码非常简单:
@functions {
LogInForm logInForm = new LogInForm();
bool IsDisabled;
SignInResult result;
protected override void OnInitialized()
{
IsDisabled = false;
}
async Task TryLogIn()
{
IsDisabled = true;
StateHasChanged();
result = await _LogInService.TryLogIn(logInForm);
Console.WriteLine("Logging status : " + (result.Succeeded ? "Sucess" : "Failure"));
IsDisabled = false;
StateHasChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
出于奇怪的原因,第一个StateHasChanged没有触发,但第二个确实重新呈现页面。通过进入调试模式并进入StateHasChanged()方法,它可以很容易地进行测试。第二次调用时,它会在进入方法后停止在 HTML 代码上,但不是第一次。
为什么这样 ?
注意:我不是在寻找任何使用Task.Delay或Task.Run(...)仅使用的解决方法,因为它在这些线程和 UI 刷新线程之间存在竞争条件,因此它不是一个可靠的解决方案。我正在寻找有关StateHasChanged()行为或解决方法的答案,方法是使用诸如PropertyChanged或之类的事件EventCallback并将按钮作为子组件。
编辑:经过一些测试,似乎StateHasChanged()只有 …
每次非登录用户尝试访问页面时,我都想使用标签中的NotAuthorized属性<AuthorizeRouteView>重定向到登录页面。
然而,它需要一个RenderFragment<AuthentificationState>类型化的参数。我应该设置什么来设置这个参数来呈现登录页面?
编辑:代码非常简单。我使用了身份存储在应用程序中的 Blazor 服务器端项目模板,只需添加RedirectToLogin.razor如下内容:
@inject NavigationManager NavigationManager
@code {
protected override void OnAfterRender()
{
NavigationManager.NavigateTo("counter"); //for an unknown reason, the "Identity/Account/Login" redirect doesn't work.
}
}
Run Code Online (Sandbox Code Playgroud)
并修改了App.razor:
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
@if(true) { } //Used for breakpoint.
<RedirectToLogin />
</NotAuthorized>
<Authorizing>
@if(true) { } //Used for breakpoint.
</Authorizing>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState> …Run Code Online (Sandbox Code Playgroud)