0

Я пытаюсь создать простой маршрут Войти и этот код работает отлично для входа в систему и отправки куки в браузере: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 method», вы имеете в виду ApiController? –

+0

@john Код идентификационного кода - мой код startup.auth –

ответ

2

Были 2 ошибки с моим оригинальным кодом

1.) По умолчанию Типы аутентификации не были согласованы. Они должны все были ApplicationCookie

2.) В Web API конфигурации, мне пришлось закомментировать следующие строки:

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

Это ставило тип аутентификации «однонаправленного», которая была несовместима с мой подход к аутентификации в приложении Cookie и, таким образом, вызывают проблемы, с которыми я столкнулся.

Смежные вопросы