在会员提供商上创建立面

时间:2009-03-24 03:04:30

标签: asp.net membership-provider facade

我在ASP.NET MVC中使用成员资格提供程序,对于大多数数据访问,我使用nHibernate和存储库模式。您是否建议在成员资格提供程序上使用Facade,以便我可以创建一个存储库并使其与我的实体模型的其余部分更加内联?我还添加了其他功能,例如向角色添加功能的功能,并且创建外观会使类更好一些。

其他人对会员提供商做了什么?

2 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。以下列方式:

web.config

<authentication mode="Forms">
  <forms name="APPAUTH"
         defaultUrl="/webapp/Home.mvc"
         loginUrl="/webapp/Session.mvc/Login"
         protection="All"
         timeout="30"
         path="/"/>
</authentication>
<authorization>
  <deny users="?"/>
</authorization>

<location path="Session">
  <system.web>
    <authorization>
      <allow users="*"/>
    </authorization>
  </system.web>
</location>

然后我按照以下方式勾选Application_AuthenticateRequest

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Context.Request.Cookies[cookieName];

    if (null == authCookie)
    {
        //no authentication cokie present
        return;
    }

    FormsAuthenticationTicket authTicket = null;
    try
    {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    }
    catch (Exception)
    {
        // Can't do anything if we can't decrypt the ticket so treat it as not there
        FormsAuthentication.SignOut(); // Remove bad ticket
    }

    if (authTicket == null)
    {
        //could not decrypt cookie
        return;
    }

    // get the role
    string[] roles = authTicket.UserData.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);

    // Set the security context
    ISecurityService security = ContainerProvider.RequestContainer.Resolve<ISecurityService>();
    Models.User user = security.GetUser(authTicket.Name);

    if (user == null)
    {
        FormsAuthentication.SignOut();
        throw new HttpException((int)System.Net.HttpStatusCode.Unauthorized, "Session expired!");
    }

    AppIdentity id = new AppIdentity(user, !authTicket.Expired);
    AppPrincipal principal = new AppPrincipal(id, roles);

    Context.User = principal;
} 

ContainerProvider.RequestContainer.Resolve<ISecurityService>();来电是Autofac容器,但您可以执行任何您需要/想要的操作。

AppIdentityAppPrincipal类是自定义的,因此我可以访问我的角色,但它们并不复杂。

答案 1 :(得分:0)

您可以通过继承MembershipProvider基类来为站点实现自己的MembershipProvider。然后只需覆盖通过nHibernate执行数据访问所需的方法。

您真正需要实现的唯一功能是ValidateUser。其余的取决于您在与MembershipProvider相关的站点中使用的功能。