gpt4 book ai didi

c# - 响应已开始 Blazor 中的 HttpContext.SignOutAsync() 方法调用引发异常

转载 作者:行者123 更新时间:2023-12-02 23:16:26 25 4
gpt4 key购买 nike

我尝试在 ASP.NET core Blazor Server 应用程序中使用 HttpContext.SignOutAsync() 来注销当前用户。调用 Httpcontext.SignOutAsync() 时引发异常。有谁知道如何解决这个问题?提前致谢。以下是异常的详细信息:

消息:

响应已开始

堆栈跟踪:

在 Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.OnStarting(Func 2 callback, Object state) at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.OnStarting(Func 2 回调,对象状态)在 Microsoft.AspNetCore.Http.DefaultHttpResponse.OnStarting(Func 2 callback, Object state) at Microsoft.AspNetCore.Http.HttpResponse.OnStarting(Func 1 个回调)在 Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler.InitializeHandlerAsync()在 Microsoft.AspNetCore.Authentication.AuthenticationHandler 1.<InitializeAsync>d__42.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Authentication.AuthenticationHandlerProvider.<GetHandlerAsync>d__5.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter 1.获取结果()在 Microsoft.AspNetCore.Authentication.AuthenticationService.d__17.MoveNext()在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在 D:\ScrumPortal\Impersonateuser\scrum-portal\ScrumPortal.Application\Base\Common\ImpersonateUserBase.cs 中的 ScrumPortal.Application.Base.Common.ImpersonateUserBase.ImpersonateLogin.d__0.MoveNext() 处:第 130 行

内部异常:

Startup.cs

           services.AddAuthentication(auth => {
auth.DefaultScheme = AzureADDefaults.AuthenticationScheme;
auth.DefaultChallengeScheme = AzureADDefaults.OpenIdScheme;
auth.DefaultSignInScheme = AzureADDefaults.AuthenticationScheme;
}).AddAzureAD(options => this.Configuration.Bind("AzureAd", options)).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options =>
{
options.LoginPath = "/signin";
options.SlidingExpiration = true;
options.ExpireTimeSpan = new TimeSpan(7, 0, 0, 0);
});
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme,
options =>
{
Configuration.Bind("AzureAd", options);
options.Events = new OpenIdConnectEvents
{
OnTokenValidated = ctx =>
{
ClaimsIdentity identity = (ClaimsIdentity)ctx.Principal.Identity;
var emailid = identity.Name;
var username = identity.Claims.FirstOrDefault(x => x.Type == "name").Value;
var res = new LoginUserModel().GetAuthenticatedUserDetails(emailid);
if (res != null && res.UserId > 0)
{
var claims = new LoginUserModel().AddUserClaims(res);
identity.AddClaims(claims);
}
else
{
ctx.Properties.RedirectUri = "/unauthorized";
return Task.FromResult(0);
}

return Task.FromResult(ctx);
}
};
});
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
config.EnableEndpointRouting = false;
});

基类

    public partial class ImpersonateLogin : PageModel
{

public async Task<IActionResult> ImpersonateBtnClick(string impersonateUserId, HttpContext httpcontext)
{
string returnUrl = "~/";
try
{
string schema = CookieAuthenticationDefaults.AuthenticationScheme;
await httpcontext.SignOutAsync(schema);
CommonModel model = new CommonModel();
int impersonateUser = 0;
int currentUser = 0;
int.TryParse(impersonateUserId, out impersonateUser);
var result = model.GetUserDetailsForImpersonate(impersonateUser);
if (result != null)
{
bool impersonateUserCheck = (currentUser == impersonateUser) ? false : true;
var claims = new System.Collections.Generic.List<Claim>
{
new Claim(SessionInfo.RoleId.ToString(), result.RoleId.ToString()),
new Claim(SessionInfo.EmailId.ToString(), result.EmailId),
new Claim(SessionInfo.EmployeeName.ToString(), result.DisplayName),
new Claim(SessionInfo.UserId.ToString(), impersonateUserId.ToString()),
new Claim(SessionInfo.IsImpersonateUser.ToString(), impersonateUserCheck.ToString().ToLower()),
new Claim(SessionInfo.CurrentUserId.ToString(), currentUser.ToString()),
new Claim(SessionInfo.HRRoleId.ToString(), result.HrRoleId.ToString()),
new Claim(SessionInfo.HRUserId.ToString(), result.HrUserId.ToString()),
};

var claimsIdentity = new ClaimsIdentity(claims, schema);
await httpcontext.SignInAsync(schema, new ClaimsPrincipal(claimsIdentity));
}
}
catch (Exception ex)
{

}

return LocalRedirect(returnUrl);
}
}

最佳答案

这是设计使然。 Blazor 服务器应用程序不在 HTTP 请求的上下文中运行。您的代码不应使用 HttpContext。有关它的文档可从 Threat mitigation guidance for ASP.NET Core Blazor Server | Blazor and shared state 获取。 .

在 Blazor 服务器应用程序中注销用户的正确方法是将用户定向到负责注销的 MVC/Razor 页面端点。

关于c# - 响应已开始 Blazor 中的 HttpContext.SignOutAsync() 方法调用引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64097119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com