代码之家  ›  专栏  ›  技术社区  ›  reustmd

ASP.NET MVC自定义授权

  •  1
  • reustmd  · 技术社区  · 15 年前

    我正在使用ASP.NET MVC构建一个Web应用程序,它有两种截然不同的用户类型。我将设计一个例子,说一种类型是内容生产者(发布者),另一种类型是内容消费者(订阅者)。

    我不打算使用内置的ASP.NET授权工具,因为我的用户类型的分离是一种二分法,您要么是发布者,要么是订户,而不是两者都是。因此,内置授权比我需要的要复杂。另外,我计划使用MySQL。

    我在考虑用一个枚举字段(技术上是一个int字段)将它们存储在同一个表中。然后创建一个customauthorizationalattribute,在这里我将传入该页面所需的用户类型。

    例如,PublishContent页需要userType==userType.publisher,因此只有发布者才能访问它。因此,创建这个属性使我可以访问httpContextBase,它包含标准用户字段(类型为iprincipal)。如何将我的用户类型字段放到这个iprincipal上?那么,我的属性应该是:

    public class PublisherAuthorizationAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (!httpContext.User.Identity.IsAuthenticated)
                return false;
    
            if (!httpContext.User.Identity.UserType == UserTypes.Publisher)
                return false;
    
            return true;
        }
    }
    

    或者有人认为我的整个方法有缺陷吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Charlino    15 年前

    我仍然会使用内置的ASP.NET窗体身份验证,但只是根据您的需要对其进行自定义。

    因此,您需要让您的用户类实现IPrincipal接口,然后编写自己的自定义cookie处理。然后您只需使用内置的[authorize]属性即可。

    目前我有类似以下的东西…

    在my global.asax中

    protected void Application_AuthenticateRequest()
    {
        HttpCookie cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName);
        if (cookie == null)
            return;
    
        bool isPersistent;
        int webuserid = GetUserId(cookie, out isPersistent);
    
        //Lets see if the user exists
        var webUserRepository = Kernel.Get<IWebUserRepository>();
    
        try
        {
            WebUser current = webUserRepository.GetById(webuserid);
    
            //Refresh the cookie
            var formsAuth = Kernel.Get<IFormsAuthService>();
    
            Response.Cookies.Add(formsAuth.GetAuthCookie(current, isPersistent));
            Context.User = current;
        }
        catch (Exception ex)
        {
            //TODO: Logging
            RemoveAuthCookieAndRedirectToDefaultPage();
        }
    }
    
    private int GetUserId(HttpCookie cookie, out bool isPersistent)
    {
        try
        {
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
            isPersistent = ticket.IsPersistent;
            return int.Parse(ticket.UserData);
        }
        catch (Exception ex)
        {
            //TODO: Logging
    
            RemoveAuthCookieAndRedirectToDefaultPage();
            isPersistent = false;
            return -1;
        }
    }
    

    会计总监.cs

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult LogOn(LogOnForm logOnForm)
    {
        try
        {
            if (ModelState.IsValid)
            {
                WebUser user = AccountService.GetWebUserFromLogOnForm(logOnForm);
    
                Response.Cookies.Add(FormsAuth.GetAuthCookie(user, logOnForm.RememberMe));
    
                return Redirect(logOnForm.ReturnUrl);
            }
        }
        catch (ServiceLayerException ex)
        {
            ex.BindToModelState(ModelState);
        }
        catch
        {
            ModelState.AddModelError("*", "There was server error trying to log on, try again. If your problem persists, please contact us.");
        }
    
        return View("LogOn", logOnForm);
    }
    

    最后,我的表单服务:

    public HttpCookie GetAuthCookie(WebUser webUser, bool createPersistentCookie)
    {
        var ticket = new FormsAuthenticationTicket(1,
                                                   webUser.Email,
                                                   DateTime.Now,
                                                   DateTime.Now.AddMonths(1),
                                                   createPersistentCookie,
                                                   webUser.Id.ToString());
    
        string cookieValue = FormsAuthentication.Encrypt(ticket);
    
        var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)
                             {
                                 Path = "/"
                             };
    
        if (createPersistentCookie)
            authCookie.Expires = ticket.Expiration;
    
        return authCookie;
    }
    

    高温高压
    查尔斯