我已经创建了自己的会员提供商,我有以下方法:
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 :(得分: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
{
}