如果我在控制器和动作上都有Authorize属性,哪一个会起作用?或者都会生效?
我正在使用jquery对asp.net mvc控制器动作进行ajax调用:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult GetWeek(string startDay)
{
var daysOfWeek = CompanyUtility.GetWeek(User.Company.Id, startDay);
return Json(daysOfWeek);
}
Run Code Online (Sandbox Code Playgroud)
当会话超时时,此调用将失败,因为User对象存储在会话中.我创建了一个自定义authorize属性,以检查会话是否丢失并重定向到登录页面.这适用于页面请求,但它不适用于ajax请求,因为您无法从ajax请求重定向:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeUserAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.Request.IsAjaxRequest())
{//validate http request.
if (!httpContext.Request.IsAuthenticated
|| httpContext.Session["User"] == null)
{
FormsAuthentication.SignOut();
httpContext.Response.Redirect("~/?returnurl=" + httpContext.Request.Url.ToString());
return false;
}
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我在另一个线程上读到,当用户未经过身份验证并且你发出ajax请求时,你应该将状态代码设置为401(未授权),然后在js中检查它并将它们重定向到登录页面.但是,我不能让这个工作:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Request.IsAjaxRequest() && (!Request.IsAuthenticated || User == null))
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
else
{
base.OnActionExecuting(filterContext);
} …Run Code Online (Sandbox Code Playgroud) 如何强制/设置MVC Core中所有操作的全局授权?
我知道如何注册全局过滤器 - 例如我有:
Setup.cs
services.AddMvc(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我无法为授权添加相同的内容:
options.Filters.Add(new AuthorizeAttribute());
我有错误:
Cannot convert from 'Microsoft.AspNet.Authorization.AuthorizeAttribute()' to 'System.Type'
(方法.Add()需要IFilterMetadata类型)
我知道 - 从类似的问题 - 这适用于MVC4-5 ......所以必须在MVC Core上改变...
有人有什么想法吗?
我使用自定义AuthorizationFilter,如下所示:
public class ActionAuthorizeAttribute : AuthorizeAttribute {
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) {
if(!httpContext.User.Identity.IsAuthenticated)
return false;
if(IsUserExcluded())
return false;
else
return IsRoleAuthorize(httpContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我在每个操作的顶部使用此过滤器,并且要检查是否已授权,需要操作名称,控制器名称和区域名称.那么有没有办法在AuthorizeCore()使用方法中获得这些名称System.Web.HttpContextBase?如果答案是否,那么我怎么能得到这个名字并将其传递给属性,显然我不想手工添加每个名字,实际上就像ViewContext.RouteData.Values["Controller"]在控制器中一样:
[ActionAuthorize(actionName=Action, controller=ControllerName, area=AreaName)]
public ActionResult Index() {
return View();
}
Run Code Online (Sandbox Code Playgroud)
有人对此有任何想法吗?
asp.net-mvc authorization authorize-attribute action-filter asp.net-mvc-3
我需要启用我的管理员用户即时更改用户的访问权限,以便他们可以创建新角色并为这些角色添加权限.
我希望能够创建一个Authorize属性,以便在我的控制器类之上,我可以从数据库添加角色,这样我就不必在开发过程中"设置"角色,如[Authorize(Roles="Role1, Role2")]等.
所以像 [Authorize(Roles = GetListOfRoles()]
我发现了这个问题 - ASP.NET MVC授权用户有很多角色,它做了类似的事情,但也许有一种方法可以改变它,以便从数据库中获取权限/角色列表?
我有一个视图,使用jQuery从控制器操作加载部分视图.控制器操作使用Authorize属性进行修饰,如果用户在调用该操作被重定向到正确的LogOn页面时超时,则LogOn页面将插入到部分视图已经消失的视图中.
还有另一篇文章在这里描述使用jQuery但遗憾的是它不包含任何代码示例这正是我需要的,因为我不是很熟悉的jQuery(和新的Web开发)的解决方案,我需要得到这个问题的解决我会尽快.
我想要做的就是将用户重定向到正确的LogOn页面,这对我来说非常直接,但到目前为止它似乎并非如此.如果jQuery是要走的路,有人可以发一个代码示例,这真的会帮助我.
谢谢.
authentication asp.net-mvc jquery partial-views authorize-attribute
我创建了两个实现的类AuthorizeAttribute.
一个是全局使用的,我将它设置在Global.asax.cs上:
filters.Add(new FirstAuthorizeAttribute() { Order = 0 });
Run Code Online (Sandbox Code Playgroud)
另一个被调用SecondAuthorizeAttribute,它只在一些动作方法中使用,我在我想要的方法中使用它作为属性.
[HttpGet]
[SecondAuthorize]
public ActionResult LogOut()
{
FormsAuthentication.SignOut();
Session.Clear();
Session.Abandon();
return Redirect(Url.Content("~/"));
}
Run Code Online (Sandbox Code Playgroud)
问题是SecondAuthorizeAttribute始终执行之前FirstAuthorizeAttribute,我需要先执行此操作.订单没有帮助,我怎么能这样做?
使用Windows Azure Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider作为MVC3应用程序的outputCache提供程序.以下是相关的操作方法:
[ActionName("sample-cached-page")]
[OutputCache(Duration = 300, VaryByCustom = "User",
Location = OutputCacheLocation.Server)]
[Authorize(Users = "me@mydomain.tld,another@otherdomain.tld")]
public virtual ActionResult SampleCachedPage()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
从Web浏览器加载此视图时出现以下异常:
System.Configuration.Provider.ProviderException: When using a custom output cache provider like 'DistributedCache', only the following expiration policies and cache features are supported: file dependencies, absolute expirations, static validation callbacks and static substitution callbacks.
System.Configuration.Provider.ProviderException: When using a custom output cache provider like 'DistributedCache', only the following expiration policies and cache features are supported: file dependencies, absolute …Run Code Online (Sandbox Code Playgroud) 构建MVC3应用程序,TPTB希望我们使用他们的自定义授权提供程序.但是,在开发过程中,这个身份验证提供程序很麻烦,因为它会在您关闭/重新启动浏览器时发出错误,或者需要您在每次编译时重新记录o.
现在,我刚刚添加<authentication mode="None"/>到web.config,它可以正常工作,直到遇到使用[Authorize(Roles = "Admin")]过滤器的操作或控制器(它可以是任何角色,而不仅仅是Admin).当它击中其中一个时,它只会呈现一个空白页面.
全球有没有办法暂时关闭这些过滤器?或者只是在我开发时为用户提供所有角色?
编辑
让我澄清一下 - 我实际上正在将一个大型应用程序从MVC2移植到MVC3.它有很多,[Authorize(Roles="Admin")]并[Authorize(Roles="Admin,Editor")]贯穿始终.如果可能的话,我宁愿不改变所有这些.
我应该创建一个自动提供所有角色的小型自定义角色提供程序吗?
c# asp.net-mvc authorization authorize-attribute asp.net-mvc-3
在我的WebAPI项目中,我有许多用[Authorize]属性修饰的api .
[Authorize]
public HttpResponseMessage GetCustomers()
{
//my api
}
Run Code Online (Sandbox Code Playgroud)
如果用户没有正确的令牌,则会向用户返回访问被拒绝的异常.
但我需要的是,在任何这种情况下,我需要返回自定义响应消息.
{
"StatusCode" : 403,
"message": "You donot have sufficient permission"
}
Run Code Online (Sandbox Code Playgroud)
如果授权失败,如何返回此自定义消息.
请注意: