Я добавляю собственный код в AuthorizeAttribute, который направляет пользователя к действию в другом контроллере, который отображает модальное всплывающее окно, когда он не подтвердил свой номер телефона. По какой-то причине код просто вечно перенаправляет то, что на веб-сайте просто написано «перенаправлял вас слишком много раз», и не достигает моей точки останова, которую я поставил в действии VerifyPhoneNumber. Можете ли вы подсказать, почему это происходит? TIA.
Вот мой собственный переопределенный класс AuthorizeAttribute ниже. Все здесь уже было, я только что добавил
if (CustomContext.AccountDomainType == AccountDomainType.ActiveDirectory &&
CustomContext.IsPhoneNumberConfirmed == false)
{
return false;
}
и
if (CustomContext.AccountDomainType == AccountDomainType.ActiveDirectory &&
CustomContext.IsPhoneNumberConfirmed == false)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "action", "VerifyPhoneNumber" },
{ "controller", "Account" }
});
return;
}
Класс CustomAuthorizeAttribute
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public Module Module { get; set; }
public Permission Permission { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var CustomContext = (Context)httpContext.Items[Context.HttpContextItemName];
var token = httpContext.Request.Form["token"];
if (!base.AuthorizeCore(httpContext) && token == null)
{
return false;
}
else if (token != null)
{
var tokenRepository = new AuthenticationTokenRepository(CustomContext);
var authenticationToken = tokenRepository.Get(token);
if (authenticationToken == null)
{
CustomContext.Log("Permission denied because authentication token was not valid");
return false;
}
var authenticationManager = httpContext.GetOwinContext().Authentication;
var userManager = httpContext.GetOwinContext().Get();
AspNetUser user;
if (authenticationToken.Role == AuthenticationTokenRole.PdfGenerator)
{
user = userManager.FindByName(authenticationToken.CreatedBy);
if (user == null)
{
CustomContext.Log("Permission denied because token creation user was not found");
return false;
}
}
else
{
return false;
}
var userIdentity = ApplicationSignInManager.GenerateUserIdentity(userManager, user, DefaultAuthenticationTypes.ApplicationCookie);
authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, userIdentity);
if (!authenticationManager.User.Identity.IsAuthenticated)
{
authenticationManager.User = authenticationManager.AuthenticationResponseGrant.Principal;
}
}
if (token == null && !CustomContext.IsDeviceAuthorized())
{
CustomContext.UpdateDevice();
httpContext.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie, DefaultAuthenticationTypes.ApplicationCookie);
CustomContext.Log("Permission denied and forced sign out because device was already signed out based on cookie check");
return false;
}
if (Module != default(Module) && Permission != default(Permission) && !CustomContext.HasPermission(Module, Permission))
{
CustomContext.Log("Permission denied because user does not have permission to " + Module.DisplayName() + ", " + Permission.DisplayName());
return false;
}
if (Module != default(Module) && Permission == default(Permission) && !CustomContext.HasModule(Module))
{
CustomContext.Log("Permission denied because company does not have the following module features turned on " + Module.DisplayName());
return false;
}
if (CustomContext.IsPasswordExpired
&& httpContext.Request.RequestContext.RouteData.Values.ContainsKey("action")
&& "ChangePassword" != httpContext.Request.RequestContext.RouteData.Values["action"].ToString()
&& "ChangePasswordLink" != httpContext.Request.RequestContext.RouteData.Values["action"].ToString())
{
CustomContext.Log("Permission denied because password is expired. Password must be changed first");
return false;
}
if (Module == default(Module) && Permission != default(Permission))
{
throw new Exception("No module specified for permission check");
}
if (CustomContext.AccountDomainType == AccountDomainType.ActiveDirectory &&
CustomContext.IsPhoneNumberConfirmed == false)
{
return false;
}
return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
var actionParams = filterContext.ActionDescriptor.GetParameters();
var paramTypes = actionParams.Select(ap => ap.ParameterType).ToArray();
var actionMethod = filterContext.Controller.GetType()
.GetMethod(filterContext.ActionDescriptor.ActionName, paramTypes);
var CustomContext = (Context)filterContext.HttpContext.Items[Context.HttpContextItemName];
var errorTypeViewPrefix = CustomContext.IsPasswordExpired ? "PasswordExpired" : "PermissionDenied";
if (CustomContext.AccountDomainType == AccountDomainType.ActiveDirectory &&
CustomContext.IsPhoneNumberConfirmed == false)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "action", "VerifyPhoneNumber" },
{ "controller", "Account" }
});
return;
}
if (actionMethod != null && (actionMethod.ReturnType == typeof(PartialViewResult) ||
actionMethod.ReturnType == typeof(Task
)))
{
// Partial views
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "action", errorTypeViewPrefix + "Partial" },
{ "controller", "Error" }
});
return;
}
// Full page views
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "action", errorTypeViewPrefix },
{ "controller", "Error" }
});
return;
}
base.HandleUnauthorizedRequest(filterContext);
}
}
}
Действие, которое я пытаюсь выполнить, которое отправляет код текстового сообщения пользователю и открывает всплывающее окно (оно существует в другом контроллере)
[Display(Name = "Verify Phone Number", Description = "Verify Phone Number")]
public async Task VerifyPhoneNumber()
{
var strictPhoneAttr = new StrictPhoneAttribute();
if (!strictPhoneAttr.IsValid(Context.PhoneNumber))
{
ModelState.AddModelError(string.Empty, "Please, change your phone number to a valid cell phone number under the menu in the top right-hand corner under your name. A valid cell phone number is required for two-factor authentication used by this system.");
}
else
{
/....code that send SMS code ......./
Context.Log("Opened Verify Phone Number modal");
return PartialView("_VerifyPhoneNumber", new VerifyPhoneNumberModel());
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... redirected
Почему моя пользовательская ошибка продолжает перенаправляться? ⇐ C#
Место общения программистов C#
-
Anonymous
1728710123
Anonymous
Я добавляю собственный код в AuthorizeAttribute, который направляет пользователя к действию в другом контроллере, который отображает модальное всплывающее окно, когда он не подтвердил свой номер телефона. По какой-то причине код просто вечно перенаправляет то, что на веб-сайте просто написано «перенаправлял вас слишком много раз», и не достигает моей точки останова, которую я поставил в действии VerifyPhoneNumber. Можете ли вы подсказать, почему это происходит? TIA.
Вот мой собственный переопределенный класс AuthorizeAttribute ниже. Все здесь уже было, я только что добавил
if (CustomContext.AccountDomainType == AccountDomainType.ActiveDirectory &&
CustomContext.IsPhoneNumberConfirmed == false)
{
return false;
}
и
if (CustomContext.AccountDomainType == AccountDomainType.ActiveDirectory &&
CustomContext.IsPhoneNumberConfirmed == false)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "action", "VerifyPhoneNumber" },
{ "controller", "Account" }
});
return;
}
Класс CustomAuthorizeAttribute
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public Module Module { get; set; }
public Permission Permission { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var CustomContext = (Context)httpContext.Items[Context.HttpContextItemName];
var token = httpContext.Request.Form["token"];
if (!base.AuthorizeCore(httpContext) && token == null)
{
return false;
}
else if (token != null)
{
var tokenRepository = new AuthenticationTokenRepository(CustomContext);
var authenticationToken = tokenRepository.Get(token);
if (authenticationToken == null)
{
CustomContext.Log("Permission denied because authentication token was not valid");
return false;
}
var authenticationManager = httpContext.GetOwinContext().Authentication;
var userManager = httpContext.GetOwinContext().Get();
AspNetUser user;
if (authenticationToken.Role == AuthenticationTokenRole.PdfGenerator)
{
user = userManager.FindByName(authenticationToken.CreatedBy);
if (user == null)
{
CustomContext.Log("Permission denied because token creation user was not found");
return false;
}
}
else
{
return false;
}
var userIdentity = ApplicationSignInManager.GenerateUserIdentity(userManager, user, DefaultAuthenticationTypes.ApplicationCookie);
authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, userIdentity);
if (!authenticationManager.User.Identity.IsAuthenticated)
{
authenticationManager.User = authenticationManager.AuthenticationResponseGrant.Principal;
}
}
if (token == null && !CustomContext.IsDeviceAuthorized())
{
CustomContext.UpdateDevice();
httpContext.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie, DefaultAuthenticationTypes.ApplicationCookie);
CustomContext.Log("Permission denied and forced sign out because device was already signed out based on cookie check");
return false;
}
if (Module != default(Module) && Permission != default(Permission) && !CustomContext.HasPermission(Module, Permission))
{
CustomContext.Log("Permission denied because user does not have permission to " + Module.DisplayName() + ", " + Permission.DisplayName());
return false;
}
if (Module != default(Module) && Permission == default(Permission) && !CustomContext.HasModule(Module))
{
CustomContext.Log("Permission denied because company does not have the following module features turned on " + Module.DisplayName());
return false;
}
if (CustomContext.IsPasswordExpired
&& httpContext.Request.RequestContext.RouteData.Values.ContainsKey("action")
&& "ChangePassword" != httpContext.Request.RequestContext.RouteData.Values["action"].ToString()
&& "ChangePasswordLink" != httpContext.Request.RequestContext.RouteData.Values["action"].ToString())
{
CustomContext.Log("Permission denied because password is expired. Password must be changed first");
return false;
}
if (Module == default(Module) && Permission != default(Permission))
{
throw new Exception("No module specified for permission check");
}
if (CustomContext.AccountDomainType == AccountDomainType.ActiveDirectory &&
CustomContext.IsPhoneNumberConfirmed == false)
{
return false;
}
return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
var actionParams = filterContext.ActionDescriptor.GetParameters();
var paramTypes = actionParams.Select(ap => ap.ParameterType).ToArray();
var actionMethod = filterContext.Controller.GetType()
.GetMethod(filterContext.ActionDescriptor.ActionName, paramTypes);
var CustomContext = (Context)filterContext.HttpContext.Items[Context.HttpContextItemName];
var errorTypeViewPrefix = CustomContext.IsPasswordExpired ? "PasswordExpired" : "PermissionDenied";
if (CustomContext.AccountDomainType == AccountDomainType.ActiveDirectory &&
CustomContext.IsPhoneNumberConfirmed == false)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "action", "VerifyPhoneNumber" },
{ "controller", "Account" }
});
return;
}
if (actionMethod != null && (actionMethod.ReturnType == typeof(PartialViewResult) ||
actionMethod.ReturnType == typeof(Task
)))
{
// Partial views
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "action", errorTypeViewPrefix + "Partial" },
{ "controller", "Error" }
});
return;
}
// Full page views
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "action", errorTypeViewPrefix },
{ "controller", "Error" }
});
return;
}
base.HandleUnauthorizedRequest(filterContext);
}
}
}
Действие, которое я пытаюсь выполнить, которое отправляет код текстового сообщения пользователю и открывает всплывающее окно (оно существует в другом контроллере)
[Display(Name = "Verify Phone Number", Description = "Verify Phone Number")]
public async Task VerifyPhoneNumber()
{
var strictPhoneAttr = new StrictPhoneAttribute();
if (!strictPhoneAttr.IsValid(Context.PhoneNumber))
{
ModelState.AddModelError(string.Empty, "Please, change your phone number to a valid cell phone number under the menu in the top right-hand corner under your name. A valid cell phone number is required for two-factor authentication used by this system.");
}
else
{
/....code that send SMS code ......./
Context.Log("Opened Verify Phone Number modal");
return PartialView("_VerifyPhoneNumber", new VerifyPhoneNumberModel());
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79079801/why-my-custom-error-keeps-getting-redirected[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия