2014-12-04 56 views
3

我正在使用WebAPI/Owin 3.0實施簡單的登錄/密碼身份驗證。下面是我的配置方法:WebAPI/Owin - 身份登錄後未獲得授權

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爲null並且沒有聲明。 Login方法中的原始身份有4個聲明,其IsAuthenticated屬性爲true。

爲什麼身份失去了所有的聲明和AuthenticationType值?

我使用本地IISExpress服務器測試本地域名上運行的應用程序。

回答

12

原來Cookie認證與SuppressDefaultHostAuthentication選項衝突。在WebApiConfig.cs中禁用此功能來解決問題。

config.SuppressDefaultHostAuthentication(); 
+0

我在過去的某個時候意識到了這一點,但是這讓我困擾了2個小時,直到我發現這篇文章。 – hunter 2015-12-03 13:45:09