响应已经启动Blazor中的HttpContext.SignOutAsync方法调用已引发异常

问题描述

我试图在ASP.NET核心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.GetResult() 在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:line 130

中的ScrumPortal.Application.Base.Common.ImpersonateUserBase.ImpersonateLogin.d__0.MoveNext()中

内部异常:

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);
            });
        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);
        }
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)