WebAPI / Owin - 登录后身份未被授权

本文关键字:身份 授权 登录 Owin WebAPI | 更新日期: 2023-09-27 18:33:02

我正在使用WebAPI/Owin 3.0实现简单的登录/密码身份验证。这是我的配置方法:

public void ConfigureAuth(IAppBuilder app) {
    // Configure the db context and user manager to use a single instance per request
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.UseCookieAuthentication(new CookieAuthenticationOptions() {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/#sign-in")
    });
}

这是登录方法

[Authorize]
[RoutePrefix("api/Account")]
public class AccountController : ApiController {
    [AllowAnonymous]
    [Route("Login")]
    public async Task<IHttpActionResult> Login(LoginBindingModel login) {
        ApplicationUser user = await UserManager.FindAsync(login.Email, login.Password);
        if(user != null) {
            var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);        
            Authentication.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity);
            return Ok("OK");
        }
        return BadRequest("Invalid email or password");
    }
}

在向登录方法发送请求后,我可以看到来自服务器的身份验证 cookie。我还看到在发送进一步请求时,cookie 被发送回服务器。但是,服务器返回 401 未经授权的响应。

我在 AuthorizeAttribute.IsAuthorized 方法中放置了一个断点。原来,actionContext.ControllerContext.RequestContext.Principal.Identity.IsAuthenticated == false,因为 AuthenticationType 为空且没有声明。登录方法中的原始标识有 4 个声明,其 IsAuthenticated 属性为 true。

为什么标识会丢失其所有声明和身份验证类型值?

我正在使用本地 IISExpress 服务器进行测试,应用程序在本地主机域上运行。

WebAPI / Owin - 登录后身份未被授权

事实证明,Cookie身份验证与SuppressDefaultHostAuthentication选项冲突。在 WebApiConfig 中禁用此功能.cs以解决此问题。

config.SuppressDefaultHostAuthentication();