问题描述
我试图在ASP.NET核心Blazor Server应用程序中使用 HttpContext.SignOutAsync()来注销当前用户。调用Httpcontext.SignOutAsync()时引发了异常。有谁知道如何解决这个问题?提前致谢。以下是该例外的详细信息:
消息:
响应已经开始
堆栈跟踪:
在Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.OnStarting(Func2 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
内部异常:
空
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 (将#修改为@)