Почему атрибут authorize не может авторизовать действие, когда вошли действительный пользователь? - PullRequest
0 голосов
/ 30 мая 2018

Я использую атрибут authorize для действия.

[Authorize(Users= "admin" )]
[HttpGet]
public JsonResult GetServices()
{
    return Json(ServicesRepository.SelectServices(), JsonRequestBehavior.AllowGet);
}

При успешном входе в систему я устанавливаю:

Session["Users"] = usersModels;                   
Session["UHTUserName"] = usersModels.UserName;
FormsAuthentication.SetAuthCookie(usersModels.UserName, LoginVM.RememberMe);

AuthorizeAttribute aattr = new AuthorizeAttribute();

aattr.Users = usersModels.UserName;

, но все равно не удаетсясанкционировать.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Основываясь на приведенном выше фрагменте кода, вы используете проверку подлинности с помощью MVC.

Когда используется проверка подлинности с помощью форм, при возникновении необходимости проверки подлинности платформа ASP.NET проверяет текущий объект типа IPrinciple,Идентификатор пользователя и роль, содержащиеся в этом объекте типа IPrinciple, будут определять, разрешен ли пользователю доступ.

До сих пор вы не написали код для передачи сведений о роли пользователя в этом основном объекте.Для этого вам нужно переопределить метод с именем FormsAuthentication_OnAuthenticate в global.asax.Этот метод вызывается каждый раз, когда ASP.NET framework пытается проверить аутентификацию и авторизацию в соответствии с текущим принципом.

Теперь вам нужно переопределить этот метод.Проверьте билет проверки подлинности (поскольку пользователь уже был проверен и билет был создан), а затем предоставьте эту информацию о пользователе / ​​роли в объекте типа IPrinciple.Для простоты вы просто создадите объект GenericPriciple и зададите в нем специфичные для пользователя детали следующим образом:

protected void FormsAuthentication_OnAuthenticate(Object sender, FormsAuthenticationEventArgs e)
{
    if (FormsAuthentication.CookiesSupported == true)
    {
        if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
        {
            try
            {
                //let us take out the username now                
                string username = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;
                string roles = string.Empty;

                using (userDbEntities entities = new userDbEntities())
                {
                    User user = entities.Users.SingleOrDefault(u => u.username == username);

                    roles = user.Roles;
                }
                //let us extract the roles from our own custom cookie


                //Let us set the Pricipal with our user specific details
                e.User = new System.Security.Principal.GenericPrincipal(
                  new System.Security.Principal.GenericIdentity(username, "Forms"), roles.Split(';'));
            }
            catch (Exception)
            {
                //somehting went wrong
            }
        }
    }
}

Примечание : в MVC 4 и более поздних версиях это событие будетне работа.Чтобы аутентификация пользовательских форм работала в MVC 4 и более поздних версиях, нам нужно поместить этот код в событие Application_PostAuthenticateRequest в файле Global.asax.

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
    if (FormsAuthentication.CookiesSupported == true)
    {
        if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
        {
            try
            {
                //let us take out the username now                
                string username = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;
                string roles = string.Empty;

                using (userDbEntities entities = new userDbEntities())
                {
                    User user = entities.Users.SingleOrDefault(u => u.username == username);

                    roles = user.Roles;
                }
                //let us extract the roles from our own custom cookie


                //Let us set the Pricipal with our user specific details
                HttpContext.Current.User  = new System.Security.Principal.GenericPrincipal(
                  new System.Security.Principal.GenericIdentity(username, "Forms"), roles.Split(';'));
            }
            catch (Exception)
            {
                //somehting went wrong
            }
        }
    }
} 

Ссылка: https://www.codeproject.com/Articles/578374/AplusBeginner-splusTutorialplusonplusCustomplusF

0 голосов
/ 30 мая 2018

Вы установили настройки в web.config для проверки подлинности с помощью форм

<system.web>
    <authentication mode="Forms"></authentication>
<system.web>

И при входе в систему установите cookie следующим образом

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, //version                                                                                
UserName,      // user name                                                                               
DateTime.Now,        // create time                                                                                   
expiration,          // expire time                                                                                   
RememberMe,    // persistent                                                                                   
strUserData);        // user data/role

HttpCookie objHttpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));

objHttpCookie.Path = FormsAuthentication.FormsCookiePath;
Response.Cookies.Add(objHttpCookie);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...