Как авторизовать пользователя OpenID на MVC Controller - PullRequest
2 голосов
/ 25 июня 2010

Я смотрю на [Authorize(Roles = "DefaultUser")], доступный в MVC, но не могу понять, могу ли я использовать его с DotNetOpenAuth.

Я использую OpenID в качестве своего единственного поставщика членства,но у меня есть несколько общих элементов в таблице UserProfile.Я не хочу, чтобы кто-либо, кроме соответствующего пользователя, имел доступ к контроллеру редактирования.

ПРИМЕР:
UserID 2 должен не иметь доступ/Users/Edit/1, но они CAN доступ /Users/Edit/2

Ответы [ 2 ]

2 голосов
/ 26 июня 2010

Редактировать / переписать для более ясного понимания

public class AdvancedAuthorizeAttribute : AuthorizeAttribute
    {
            public string RouteDataValue
            {
                get;
                set;
            }

            protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                if(base.AuthorizeCore(httpContext))
                {
                    MvcHandler mvcHandler = httpContext.CurrentHandler as MvcHandler;
                    if (mvcHandler != null)
                    {
                        var paramValue = mvcHandler.RequestContext.RouteData.Values[RouteDataValue];
                        if (paramValue != null)
                        {
                            // Inside this IF-statement is where you'll have to customize for your code.

                            //I use the default user from HttpContext
                            string UserPrincipalName = httpContext.User.Identity.Name;
                            // I use email as login name, and here I try to fetch a user from my repository with that email.
                            User userObject = new Repository<User>().GetOne(x => x.Email == UserPrincipalName);
                            // If I find a user, and that user's UserID is equal to the value in paramValue, it's Ok! Otherwise, not.
                            return (userObject != null && userObject.UserID.ToString() == paramValue.ToString());
                        }
                    }
                }
                return false;
            }
    }

И затем, используя его:

// Example usage (for instance from UserController)
[AdvancedAuthorize(RouteDataValue="userID")]
public ActionResult Edit(int userID)
{
     // everything as normal
}

[AdvancedAuthorize(RouteDataValue="userEmail")]
public ActionResult Delete(string userEmail)
{
     // everything as normal
}

Конечно, чтобы это работало, userIDи userEmail в примерах действий должен быть связан с привязкой модели (параметры должны существовать в RouteData.Values), чтобы он работал.

0 голосов
/ 25 июня 2010

Я не думаю, что [Authorize(Roles = "DefaultUser")] означает, что люди могут редактировать только свой профиль. Это скорее означает, что каждый в роли DefaultUser может редактировать профили ... Вот обсуждение этого вопроса, это почти тот же вопрос: авторизация asp.net mvc с использованием ролей

EDIT: Хорошо, тогда ваша проблема в том, что роли и личность не работают с OpenID? Функция Authorize работает только в том случае, если HttpContext.Current.User содержит правильный принципал. Если вы используете OpenID, этого не происходит из коробки, но вы должны сделать что-то подобное в вашем Global.asax:

void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null)
    {
        string encTicket = authCookie.Value;
        if (!String.IsNullOrEmpty(encTicket))
        {
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(encTicket);
            YourAppIdentity id = new YourAppIdentity(ticket);
            string username = ticket.Name;
            string[] roles = Roles.GetRolesForUser(username);
            GenericPrincipal prin = new GenericPrincipal(id, roles);
            HttpContext.Current.User = prin;
        }
    }
}

где YourAppIdentity должен быть чем-то, что реализует IIdentity ...

...