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身份验证方法,从而导致我遇到的问题。