Переопределение OnCacheAuthorization - PullRequest
1 голос
/ 15 июня 2011

Я хотел бы написать свой собственный OnCacheAuthorization метод для asp.net mvc, чтобы контролировать доступ пользователей к сайту.

Я написал свою собственную систему регистрации, чтобы после входа в системуВы должны ввести еще несколько данных, пока учетная запись не будет авторизована (я контролирую это с помощью varibale).Поэтому, если пользователь не завершит процедуру, он не сможет посетить другие страницы сайта.

Я написал следующий метод:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    base.OnAuthorization(filterContext);


    var httpContext = filterContext.HttpContext;
    String culture = HttpContext.Current.Session["Culture"].ToString();
    var identity = httpContext.User.Identity;
    MembershipUser userMembership = Membership.GetUser(identity.Name);
    Guid userId = new Guid(userMembership.ProviderUserKey.ToString());
    String redirectUrl = "~/" + culture + "/Error/UserRegistrationNotFinished";
    httpContext.Request.Url.ToString();
    filterContext.Result = new EmptyResult();

    if ((!userMembership.IsApproved) && AuthorizeCore( filterContext.HttpContext ))
    {
        filterContext.HttpContext.Response.Redirect(redirectUrl, true);
    }
    else
    {
        filterContext.HttpContext.Response.Redirect(filterContext.RequestContext.HttpContext.Request.Url.ToString(),true); 
    }
}

Этот метод работает.Если пользователь не завершил процедуру входа в систему, он правильно перенаправляется на страницу UserRegistrationNotFinished.Проблема в том, что если процедура входа в систему завершена, метод не позволяет ему перейти на страницу, которую он ввел в URL.Я получаю только пустую страницу, и метод зацикливается.

Как я могу написать этот метод, чтобы он также работал для одобренных пользователей?

1 Ответ

1 голос
/ 19 июня 2011

Я нашел ответ, я неправильно понял всю концепцию. Вот решение, которое работает:

public class ActivationRequiredAttribute : AuthorizeAttribute
{
    private readonly string _redirectUrl;
    private bool _failedValidation;

    public ActivationRequiredAttribute()
    {
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        UserInfoRepository _userInfoRepository = new UserInfoRepository();
        var identity = httpContext.User.Identity;
        MembershipUser userMembership = Membership.GetUser(identity.Name);
        Guid userId = new Guid(userMembership.ProviderUserKey.ToString());
        userInfo _userInfo = _userInfoRepository.GetUser(userId);

        if (httpContext == null)
            throw new ArgumentNullException("httpContext");

        if ((httpContext.User.Identity.IsAuthenticated) && (userMembership.IsApproved)&&(_userInfo.userStatus == 1))
        {
            _failedValidation = true;
            return true;
        }
        else
        {
            _failedValidation = false;
            return false;
        }

        // return false;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        String redirectUrl = "~/Error/UserRegistrationNotFinished";

        if (!_failedValidation)
        {
            filterContext.HttpContext.Response.Redirect(redirectUrl, true);
            //filterContext.Result = View(,)
        }
    }
}
...