AspNetCore 2.2 as API - 如何使用身份方法注销?



我用 Angular 7 作为前端创建了 Web 应用程序, DotNetCore 2.2 作为后端 API(SQL Server for db(。 最初创建项目时,我没有添加身份验证,因为 不需要 UI 页面。我计划将身份验证与 Cookie 一起使用。

虽然登录和[授权]运行良好,但注销不适用于signInManager.SignOutAsync((。

Microsoft指出: "SignOutAsync 清除存储在 cookie 中的用户声明。 调用 SignOutAsync 后不要重定向,否则用户将不会注销。 似乎 cookie 没有被删除,并且它被 API 接受为有效(除非它已过期(。 我尝试使用Response.Cookies.Delete((和HttpContext.SignOutAsync((没有成功。

public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CORS", builder => 
{
builder.WithOrigins("http://localhost:42000")
.AllowAnyHeader()
.AllowCredentials();
});
});
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<NGDbContext>(options =>  options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<NGUser, IdentityRole>()
.AddEntityFrameworkStores<NGDbContext>()
.AddDefaultTokenProviders();
services.Configure<IdentityOptions>(options =>
{
// some options...
});
services.ConfigureApplicationCookie(options =>
{
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(1);
options.SlidingExpiration = true;
//options.CookieName = "MyCookie";
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddScoped<NamesService, NamesService>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
InitialSeeder.Seed(app);
}
else
{
app.UseHsts();
}
app.UseCors("CORS");
app.UseHttpsRedirection();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc();
}
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
private UserManager<NGUser> userManager;
private SignInManager<NGUser> signInManager;
public AuthController(UserManager<NGUser> userManager, SignInManager<NGUser> signInManager)
{
this.userManager = userManager;
this.signInManager = signInManager;
}
[HttpPost("Login")]
public async Task<ActionResult> Login(LoginModel model)
{
var user = await this.userManager.FindByNameAsync(model.Username);
if (user == null)
{
return Unauthorized();
}
var signInResult = await this.signInManager.PasswordSignInAsync(user, model.Password, false, false);
if (!signInResult.Succeeded)
{
return Unauthorized();
}
return Ok();
}
[HttpPost("Logout")]
public async Task<ActionResult> Logout()
{
await this.signInManager.SignOutAsync();
return Ok();
}
}

是否可以从标识登录注销方法中受益? 还是应该使用自定义方法?

要成功注销 signInManager.SignOutAsync(( 只需要一个 cookie。
我没有提供 Angular HttpClient.post(( 方法 - 我错过了 null 作为第二个参数。
工作角侧:

login(model: LoginModel){
return this.http.post("https://localhost:50000/api/auth/login", model, { withCredentials: true });
}
logout(){
return this.http.post("https://localhost:50000/api/auth/logout", null, { withCredentials: true });
}

工作 .Net 端:两种注销方法都有效:

  • 这。HttpContext.Response.Cookies.Delete(".AspNetCore.Identity.Application"(;
  • await this.signInManager.SignOutAsync((;

第一个只删除选定的cookie,而第二个删除三个.AspNetCore.Identity.ApplicationIdentity.ExternalIdentity.TwoFactorUserId
SignOutAsync 调用三种方法:await Context.SignOutAsync(IdentityConstants.ApplicationScheme);await Context.SignOutAsync(IdentityConstants.ExternalScheme);

await Context.SignOutAsync(IdentityConstants.TwoFactorUserIdScheme);

是的,可以在 API 中使用身份。

相关内容

  • 没有找到相关文章

最新更新