我正在构建我的网站,我想限制我的网站的一部分(管理部分)来自正常的公开显示。
到目前为止,我已经 能够使用MembershipProvider和/或RoleProviders等找到示例。说实话,对我想要的东西看起来似乎太多了。 所有这一切是让您在输入字段中输入正确的密码。
我真的不能避开提供商吗?
答案 0 :(得分:6)
由于您只有一个用户,因此无需创建数据库依赖关系。您可以根据硬编码凭据制作非常简单的授权服务。例如,
public class AuthorizationService{
private AuthorizationService(){}
public static readonly AuthorizationService Instance = new AuthorizationService();
private const string HardCodedAdminUsername = "someone";
private const string HardCodedAdminPassword = "secret";
private readonly string AuthorizationKey = "ADMIN_AUTHORIZATION";
public bool Login(string username, string password, HttpSessionStateBase session){
if(username.ToLowerInvariant().Trim()==HardCodedAdminUsername && password.ToLowerInvariant().Trim()==HardCodedAdminPassword){
session[AuthorizationKey] = true;
return true;
}
return false;
}
public void Logout(HttpSessionStateBase session){
session[AuthorizationKey] = false;
}
public bool IsAdmin(HttpSessionStateBase session){
return session[AuthorizationKey] == true;
}
}
然后您可以构建自定义IAuthorizationFilter
,如:
public class SimpleAuthFilterAttribute: FilterAttribute, IAuthorizationFilter{
public void OnAuthorization(AuthorizationContext filterContext){
if(!AuthorizationService.Instance.IsAdmin(filterContext.HttpContext.Session)){
throw new UnauthorizedAccessException();
}
}
}
然后你所要做的就是用SimpleAuthFilter
装饰受保护的控制器动作,你应用程序的登录突然起作用。好极了! (注意,我在StackOverflow应答窗口中编写了所有这些代码,因此您可能需要在实际工作之前清除错别字等)
,如果您发现不必要,可以重构此操作以省略用户名。如果您希望可以访问受保护的控制器操作,则需要为Login
和Logout
创建一个控制器操作,以对AuthorizationService
进行相应的调用。
答案 1 :(得分:3)
值得建立一个轻量级的会员提供商,实施最少; GetUser,ValidateUser等方法。你不需要实现整个事情。它只是帮助授权页面并在需要时检查User.Identity等。您也不需要RoleProvider或ProfileProvider来执行此操作。
它也可以扩展到未来。
<强>更新强>
您只需要实现核心方法来验证并获取用户并插入您自己的验证/数据访问代码。
像这样......
web.config设置:
<membership defaultProvider="ApplicationMembershipProvider">
<providers>
<clear/>
<add name="ApplicationMembershipProvider" type="YourNamespace.ApplicationMembershipProvider"/>
</providers>
</membership>
登录代码:
if (Membership.ValidateUser(username, password))
{
FormsAuthentication.SetAuthCookie(username, false);
}
答案 2 :(得分:0)
您可以在会话变量中设置状态(登录与否)。如果用户输入了正确的密码,则将变量设置为true,然后在要限制访问的每个页面上,检查变量是否为真。
答案 3 :(得分:0)
@KristianB前一段时间我回答了this SO question。我相信它可能很有用,因为它实现起来非常简单,同时它比在代码中硬编码用户名和密码更好。
祝你好运!