Is this the correct way of populating user's roles using ServiceStack to a custom IPrincipal for autowired authorization in Forms Authentication

StackOverflow https://stackoverflow.com/questions/22124487

Pergunta

I'm using Servicestack for the middle tier logic/web services part of my asp.net mvc app. On the front-end, I'm using FormsAuthentication + "auth/credentials" to enable authentication/authorization to both asp.net and servicestack.

In some of my mvc controllers, Im using the built-in User (IPrincipal) for roles/permission checking,

[Authorize]
public ActionResult Index()
    {
        if (!User.IsInRole("admin"))
            ViewBag.ErrorMessage = "Access Denied";

        return View();
    }

I learned that the roles in the default User don't get populated during forms authentication, thus I created my custom class, based from IPrincipal, and set that as HttpContext.Current.User during calls to PostAuthenticateRequest

Is this the correct way to get/set the roles/permission from servicestack into the HttpContext.Current.User?

public class CustomPrincipal : IPrincipal
    {
        //private readonly IEnumerable<string> _roles;

        public IIdentity Identity { get; private set; }

        public bool IsInRole(string role)
        {
            // retrieve roles from servicestack cache  
            var key = ServiceStack.ServiceInterface.SessionFeature.GetSessionKey() ?? "";
            var sess = fubar.web.App_Start.AppHost.Resolve<ServiceStack.CacheAccess.ICacheClient>().Get<ServiceStack.ServiceInterface.Auth.AuthUserSession>(key);

            if (sess != null)
                return sess.Roles.Contains(role);
            return false;                
        }

        public CustomPrincipal(string name)
        {
            Identity = new GenericIdentity(name);
            //_roles = roles;
        }

        public long Id { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
    }

Btw, here's my Login method, and pls do check if this is also the correct way of dual auth to asp.net formsauthentication and servicestack. :)

try
            {
                var authService = AppHostBase.Resolve<AuthService>();
                authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();
                var response = authService.Authenticate(new Auth
                {
                    UserName = model.UserName,
                    Password = model.Password,
                    RememberMe = model.RememberMe
                });

                var version = 1;
                var now = DateTime.Now;

                var timeout = FormsAuthentication.Timeout;
                var expire = now.Add(timeout);

                var user = new User
                {
                    FirstName = "first",
                    MiddleName = "middle",
                    LastName = "last"
                };
                var serializer = new JavaScriptSerializer();
                var userData = serializer.Serialize(user);

                var ticket = new FormsAuthenticationTicket(
                     version,
                     model.UserName,
                     now,
                     expire,
                     model.RememberMe,
                     userData);

                Response.Cookies.Add(new HttpCookie(
                    FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket))
                    {
                        Secure = FormsAuthentication.RequireSSL
                    });

                FormsAuthentication.GetRedirectUrl(model.UserName, model.RememberMe);

                // add ASP.NET auth cookie
                //FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

                return Url.IsLocalUrl(returnUrl) ? Redirect(returnUrl) : Redirect("~/");
            }
            catch (HttpError ex)
            {
                ModelState.AddModelError("", "Error occured.\n" + ex.Message);
            }

Many thanks!

Nenhuma solução correta

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top