2015-04-10 2 views
1

Я создал свой собственный поставщика членства, где у меня есть ниже метод:пользовательского поставщика членства с ОС Windows authetication

public override bool ValidateUser(string username, string password) 
{ 
    if (username == "John") 
     return true; 
    else 
     return false; 
} 

Я также добавил ниже строк файла web.config:

<authentication mode="Windows" /> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <membership defaultProvider="MembershipProviter"> 
     <providers> 
     <clear /> 
     <add name="cls_MembershipProvider" type="App.cls_MembershipProvider" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="false" 
      requiresQuestionAndAnswer="false" 
      requiresUniqueEmail="false" 
      maxInvalidPasswordAttempts="5" 
      minRequiredPasswordLength="5" 
      minRequiredNonalphanumericCharacters="0" 
      passwordAttemptWindow="10" 
      applicationName="App" 
      /> 
     </providers> 
    </membership> 

Как вы можете заметить, я использую проверку подлинности Windows, и у меня нет страницы входа. По умолчанию все пользователи из Active Directory имеют доступ к странице. Моя цель - проверить, существует ли пользователь в моей базе данных. Везде, где я искал, есть страница входа в систему, где запускается ValidateUser. Мой вопрос: где я должен реализовать метод ValidateUser, поскольку у меня нет страницы входа. Я просто хочу иметь контроль над каждым методом Controler, поэтому я мог бы добавить [Authorize], чтобы только пользователи из моей базы данных могли фактически получить доступ к странице.

+0

Пробовали ли вы решение я предложил ниже? Ваша проблема решена? – SBirthare

ответ

1

Вы можете указать свой собственный CustomAuthorizeAttribute, полученный из AuthorizeAttribute. Переопределить метод OnAuthorization для выполнения проверки с использованием деталей в контексте. Примените свой настраиваемый фильтр поверх каждого контроллера или определите BaseController и выведите контроллеры с BaseController. Например, вы можете определить класс, как:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public sealed class RdbiAuthorizationAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// Verifies that the logged in user is a valid organization user. 
    /// </summary> 
    /// <param name="filterContext"></param> 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Guard.ArgumentNotNull(filterContext, "filterContext"); 
     Guard.ArgumentNotNull(filterContext.Controller, "filterContext.Controller"); 

     bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(
      typeof(AllowAnonymousAttribute), inherit: true) 
           || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
            typeof(AllowAnonymousAttribute), inherit: true); 

     if (skipAuthorization) 
     { 
      return; 
     } 

     if (string.IsNullOrEmpty(filterContext.HttpContext.User.Identity.Name)) 
      throw new AuthenticationException("User must be logged in to access this page."); 

     var controller = filterContext.Controller as BaseController; 
     if (controller != null) 
     { 
      var user = controller.GetUser(); 

      if (user == null) 
      { 
       throw new InvalidOperationException(string.Format("Logged in user {0} is not a valid user", filterContext.HttpContext.User.Identity.Name)); 
      } 
     } 

     base.OnAuthorization(filterContext); 
    } 
} 

Затем вы можете определить контроллер, как:

[RdbiAuthorization] 
public class BaseController : Controller 
{ 
} 

public class MyTestController : BaseController 
{ 
} 
Смежные вопросы