2014-02-14 3 views
7

Мне нужно было настроить класс UserManager для поиска и проверки подлинности пользователей в структуре компании (смешивает аутентификацию Active Directory с другим Oracle Authetication). Хотя я реализовал FindAsync и CreateIdentityAsync, пользователь не установлен как аутентифицированный.OWIN - Пользовательская настройка UserManager

Мои UserManager реализация:

using System; 
using System.Collections.Generic; 
using System.Dynamic; 
using System.Security.Claims; 
using System.Web; 
using MyProject.Common; 
using MyProject.Models; 
using Microsoft.AspNet.Identity; 
using System.Threading.Tasks; 

namespace MyProject.Infrastructure 
{ 
    public class GNUserManager : UserManager<ApplicationUser> 
    { 
     public GNUserManager(IUserStore<ApplicationUser> store) : base(store) 
     { 

     }   

     public override async Task<ApplicationUser> FindAsync(string userName, string password) 
     { 
      /* Performs some logic here that returns true */ 

      if (foundUser) { 
       return await Task.Run(() => new ApplicationUser 
       { 
        UserName = userName, 
        Id = userName 
       }); 
      } 

      throw new Exception("User not found."); 
     } 

     public override async Task<ClaimsIdentity> CreateIdentityAsync(ApplicationUser user, string authenticationType) 
     { 
      IList<Claim> claimCollection = new List<Claim> 
      { 
       new Claim(ClaimTypes.Name, user.UserName), 
       new Claim(ClaimTypes.Country, "Brazil"), 
       new Claim(ClaimTypes.Email, user.UserName) 
      }; 

      var claimsIdentity = new ClaimsIdentity(claimCollection, "Company Portal"); 

      return await Task.Run(() => claimsIdentity); 
     } 
    } 
} 

Чего не хватает, что мой пользователь аутентифицирован?

ответ

1

UserManager управляет идентификатором пользователя в базе данных, а также проверяет учетные данные. Короче говоря, это инструмент поиска в DB. Чтобы заставить пользователя войти в ваше приложение, вам нужно указать какой-то токен (например, cookie для приложений браузера или токен для приложений api). Самый последний подход в ASP.NET связан с промежуточным ПО для проверки подлинности Cookie для приложений браузера. Смотрите здесь для получения дополнительной информации о печенье промежуточного слоя:

http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/

+0

Я видел этот сайт вчера, но это всего лишь взгляд на то, что я ищу. Это именно то, что меня интересует. –

1

Глядя на метод входа в аккаунт, созданный в проекте ASP.NET MVC 5 по умолчанию мы можем увидеть этот код:

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

Что мы можем обратите внимание, что AuthenticationManager, который является тем, кто заботится о регистрации авторизации, после того, как мы получим идентификационную информацию, также необходимо для входа в систему с помощью AuthenticationManager. Так что, может быть, ваша проблема не с UserManager.

AuthenticationManager экземпляр в контроллер класса извлекается этот код:

private IAuthenticationManager AuthenticationManager 
{ 
    get 
    { 
     return HttpContext.GetOwinContext().Authentication; 
    } 
} 
+0

Эта строка: 'AuthenticationManager.SignIn (новый AuthenticationProperties() {IsPersistent = isPersistent}, идентификатор);' выполняется нормально, но cookie не генерируется. Отладка этого кода Я погружаюсь в 'public override async Task CreateIdentityAsync (пользователь ApplicationUser, строка authenticationType)'. Мне нужно выяснить, как сгенерировать cookie. –

+0

Может быть, вы можете назвать базовый метод, которым вы управляете? – iuristona

+0

Пробовали раньше, без результата. –

2

Попробуйте изменить эту строку.

var claimsIdentity = new ClaimsIdentity(claimCollection, "Company Portal"); 

Для этого

var claimsIdentity = new ClaimsIdentity(claimCollection, DefaultAuthenticationTypes.ApplicationCookie); 

Это должно генерировать ваше печенье для вас, что необходимо.

1

Поставщик данных Oracle для .NET в настоящее время не поддерживает асинхронный запрос и сохранение.

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