0

我試圖創建一個簡單的登錄路線和這個代碼工作正常登錄和發送的cookie到瀏覽器:ASP.NET身份未授權正確

[Route("Login")] 
[AllowAnonymous] 
public async Task<IHttpActionResult> Login(UserBindingModel model) 
{ 
    if (ModelState.IsValid) 
    {    
     var user = await UserManager.FindUserAsync(model.username, model.password); 

     if (user != null) 
     { 
      await SignInAsync(user, true); 
      return Ok(); 
     }    
    } 

    return BadRequest(); 
} 

這裏是SignInAsync方法被呼叫:

private async Task SignInAsync(ApplicationUser user, bool isPersistent) 
{ 
    Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 
    Authentication.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); 
} 

這裏是我的IdentityConfig:

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(IUserStore<ApplicationUser> store) 
     : base(store) 
    { 
    } 

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    { 
     var manager = new ApplicationUserManager(new TestUserStore()); 

     // Configure validation logic for usernames 
     manager.UserValidator = new UserValidator<ApplicationUser>(manager) 
     { 
      AllowOnlyAlphanumericUserNames = false, 
      RequireUniqueEmail = true 
     }; 
     // Configure validation logic for passwords 
     manager.PasswordValidator = new PasswordValidator 
     { 
      RequiredLength = 6, 
      RequireNonLetterOrDigit = false, 
      RequireDigit = true, 
      RequireLowercase = true, 
      RequireUppercase = false, 
     }; 
     var dataProtectionProvider = options.DataProtectionProvider; 
     if (dataProtectionProvider != null) 
     { 
      manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity")); 
     } 

     return manager; 
    } 

    public async Task<ApplicationUser> FindUserAsync(string username, string password) 
    { 
     var userStore = new TestUserStore(); 
     ApplicationUser user = await userStore.FindByNameAsync(username, password); 
     return await Task.FromResult(user); 
    } 
} 

儘管如此發送cooki e到瀏覽器正確和身份驗證部分工作,每當我打電話給另一個API控制器,我總是得到該請求未經授權。我對身份框架並不是非常熟悉,所以我不知道發生了什麼。

+0

你能否包含你的啓動驗證碼? – john

+0

「api方法」,你的意思是ApiController? –

+0

@john identityconfig代碼是我的startup.auth代碼 –

回答

2

我的原始代碼有2個錯誤

1.)默認驗證類型不一致。他們應該都曾經ApplicationCookie

2)在Web API的配置,我不得不註釋掉以下行:

config.SuppressDefaultHostAuthentication(); 
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

這是設置身份驗證類型爲「載體」,這是不一致我的應用程序Cookie身份驗證方法,從而導致我遇到的問題。