2013-08-13 15 views
0

У меня есть приложение Intranet MVC4 (с использованием шаблона по умолчанию). Я использую проверку подлинности Windows как мою систему входа, однако, я хочу, чтобы иметь возможность захватить некоторые детали от пользователя при первом их регистрации на сайте.Настройка проверки подлинности для проверки подлинности Windows

Прецеденты

  1. Первый раз, когда пользователь выполняет проверку подлинности с использованием их AD Логин (в данный момент). Они представлены с надписью «Введите ваши данные».
  2. Второй пользователь аутентифицируется, используя свой логин AD. Они принимаются прямо на главный экран.

Приветствия, Dave

+0

Создать пользовательский атрибут авторизации, в котором вы проверяете, имеются ли детали для пользователя, сохраненного в базе данных, если нет, перенаправляйте пользователя на представление «Введите ваши данные». – ataravati

+0

Можете ли вы опубликовать ответ на этот вопрос, с некоторыми примерами легкого кода? Я надеялся, что есть способ направить их в View on Authorization (как и в случае с Forms Auth). Мне также нужно будет знать, как получить их данные из окна auth, если я должен реализовать пользовательский атрибут. –

ответ

2

Создание пользовательских AuthorizeAttribute так:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    private UnitOfWork _unitOfWork = new UnitOfWork(); 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = false; 
     var username = httpContext.User.Identity.Name; 
     // Some code to find the user in the database... 
     var user = _unitOfWork.UserRepository.Find(username); 
     if(user != null) 
     { 
      // Check if there are Details for the user in the database 
      if(user.HasDetails) 
      { 
      isAuthorized = true; 
      } 
     } 


     return isAuthorized; 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    {    
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (!AuthorizeCore(filterContext.HttpContext)) 
     { 
      // If not authorized, redirect to the Details action 
      // of the Account controller... 

      var action = filterContext.RouteData.Values["action"]; 
      if(filterContext.Controller is AccountController 
      && action.Equals("Details")) 
      { 
      // Do nothing 
      } 
      else 
      { 
      filterContext.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary { 
       {"controller", "Account"}, {"action", "Details"} 
       } 
      ); 
      }    
     } 
    } 
} 

Затем, вы можете использовать его в контроллерах как это:

[MyAuthorize] 
public class HomeController : Controller 
{ 
} 

Или ты может зарегистрировать его как глобальный фильтр действий в файле Global.asax следующим образом:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new MyAuthorizeAttribute()); 
} 
+0

Это отлично. Спасибо –

+0

Как в стороне, можете ли вы добавить чек, чтобы подтвердить, что вызываемое действие не является действием «Подробности»? В противном случае мы получим цикл. –

+0

См. Обновленный ответ. – ataravati

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