public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            DateTime start = DateTime.Now;            

            // allow CORS to "*" domains
            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

            string
                role = "",
                userId = "",
                nickName = "",
                login = "";

            AuthRepository users = new AuthRepository();
            User user = users.FindByLogin(context.UserName);

            if (user == null)
            {
                context.SetError("invalid_grant", "The user name is incorrect.");
                return;
            }

            if (context.Password != user.Password)
            {
                context.SetError("invalid_grant", "The password is incorrect.");
                return;
            }

            if (user.Admin == null)
            {
                context.SetError("invalid_grant", "User is blocked.");
                return;
            }

            // role is user privileges in the local (web) application
            role = user.Admin.Value ? "Admin" : "User";
            // id need for fast request to users table (find by id more fast than by name)
            userId = user.Id.ToString();
            // displayed name to application window
            nickName = user.Login; // This appropriation is unacceptable
            // private name, used as login (using for server access)
            login = context.UserName;
            // bad practice when: nickName = userName

            // "identity" sent to client as private data
            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim("id", userId));
            identity.AddClaim(new Claim("role", role));
            identity.AddClaim(new Claim("login", login));

            // "props" sent to client as public data
            var props = new AuthenticationProperties(new Dictionary<string, string>
                {
                    { "userId", userId },
                    { "userRole", role },
                    { "nickName", nickName }
                });

            // creating response "ticket" for client request
            var ticket = new AuthenticationTicket(identity, props);

            #region LOGGER: Block for refactoring
            // ======================================================
            // ------------------------------------------------------
            Client clt = new Client() { Ip = "127.0.0.1", Agent = "Chrome" };

            var text =
                "{\"lvl\":\"TRACE\",\"time\":\"" +
                String.Format("{0:HH:mm:ss.fff}", DateTime.Now).ToString() +
                "\",\"userId\":" + userId +
                ",\"login\":\"" + login +
                "\",\"role\":\"" + role +
                "\",\"act\":\"LOGIN\",\"ip\":\"" + clt.Ip +
                "\",\"agent\":\"" + clt.Agent +
                "\",\"lag\":" + (DateTime.Now - start).Milliseconds.ToString() +
                ",\"stat\":200,\"message\":\"Ok\"},";

            Logger log = LogManager.GetCurrentClassLogger();

            log.Trace(text);
            // ------------------------------------------------------
            // ======================================================
            #endregion

            context.Validated(ticket);
        }
 public AccountController()
 {
     _users = new AuthRepository();
 }