我有一组控制器,每个控制器用于每种授权类型.例如,A类授权将拥有一组控制器,每个控制器都需要A类授权.有没有办法将一个[Authorize(Role="Class A")]属性放在某个适用于每个控制器的地方,而不必用相同的属性装饰每个控制器?
asp.net-mvc controller authorize authorize-attribute asp.net-mvc-3
我有一个使用owin运行的asp.net 4.5 web api.无论何时发出未经授权的请求,它都会按预期返回401以及以下响应:
{"Message":"Authorization has been denied for this request."}
Run Code Online (Sandbox Code Playgroud)
我想在此响应中添加其他详细信息(过期令牌,无效角色等等),并[AuthorizeAttribute]根据此SO帖子实施自定义.
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
var response = actionContext.Request.CreateResponse<MyError>
(new MyError() { Description = "This is why you're unauthorized" });
response.StatusCode = HttpStatusCode.Unauthorized;
actionContext.Response = response;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器上使用它,如下所示:
[MyAuthorizeAttribute(Roles = "Foo")]
public class MyController : ApiController
{
...
}
Run Code Online (Sandbox Code Playgroud)
返回401,并按预期返回以下响应:
{"Description": "This is why you're unauthorized"}
Run Code Online (Sandbox Code Playgroud)
不过,我看不出如何确定请求来自于未授权的原因HttpActionContext传递给MyAuthorizeAttribute.HandleUnauthorizedRequest.例如,当我在本地进行调试并使用过期令牌发出请求时,它会抛出一个SecurityTokenExpiredException解释IDX10223: Lifetime validation …
asp.net authorize-attribute asp.net-web-api owin asp.net-web-api2
我正在开发一个将使用Windows角色提供程序的项目,我想限制某些AD组的功能.
使用MVC,我可以使用AuthorizeAttribute上面的操作方法并相应地重定向.对于不使用MVC的标准Web表单应用程序(.NET 3.5),我能做些类似的事情吗?
如果用户未登录并且他们请求标记的操作[Authorize],则响应是重定向到Account/LogOn操作(状态代码302 Found).
有没有办法让响应成为状态代码403 Forbidden?
我有一个简单的ASP.Net MVC 3应用程序,它有一些控制器和一些很好的操作.
现在,由于这是基于用户的应用程序,因此大多数控制器操作都需要对用户进行身份验证.MVC使用内置的Authorize属性处理这个问题,您可以使用该属性单独装饰控制器和/或操作.
最棒的是你可以将属性应用于控制器,并且给定控制器的所有操作也将应用它 - 保存了大量的输入;)
但我有一个控制器,比方说,10个动作.但我希望其中一个操作没有应用Authorize属性.
是的,我可以将该属性应用于其他9并将其从控制器中删除,这将完全符合我的需要.但有没有办法让它应用于控制器,只是选择排除其中一个动作?
实际上,会想要......
[!Authorize] 要么 [NotAuthorize]
我知道我可以创建一个可以完成这项工作的自定义工具,但我想知道的是,是否有内置方法可以做到这一点?或者我是否必须将该属性应用于所有其他9个其他操作?
我AuthorizeAttribute在遗留MVC5项目中有一个自定义:
public class AuthorizeWithLoggingAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!base.AuthorizeCore(httpContext)) {Log(FilterContext);}
}
}
Run Code Online (Sandbox Code Playgroud)
我们在查看日志时注意到,除了要应用于控制器之外[AuthorizeWithLogging],它还在代码中的其他位置显式调用,生成虚假日志:
var filters = new FilterInfo(FilterProviders.Providers.GetFilters(controllerContext, actionDescriptor));
foreach (var authFilter in filters.AuthorizationFilters)
{
authFilter.OnAuthorization(authContext);
if (authContext.Result != null) {return false;}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉(通过StackTrace什么)OnAuthorization方法是显式调用,还是从属性调用?我目前最好的是
Environment.StackTrace.Contains("at System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters").
我只想知道AuthorizeAttribute的生命周期,并开始调试AuthorizeAttribute的默认构造函数,但无法获得任何命中.
这是自定义授权过滤器的代码.
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public CustomAuthorizeAttribute() : base()
{
string test = string.Empty;
}
public override void OnAuthorization(HttpActionContext actionContext)
{
//Some code
}
}
Run Code Online (Sandbox Code Playgroud)
有人请帮我理解这个AuthorizeAttribute的生命周期吗?
谢谢
我只是ASP.NET MVC的新手,我不确定如何以"正确的方式"完成某项任务.
本质上,我将登录的userId存储在HttpContext.User.Identity中,并编写了一个EnhancedAuthorizeAttribute来执行一些自定义授权.
在overriden OnAuthorization方法中,我的域模型命中数据库以确保当前用户id可以访问传入的routeValue"BatchCode".原型是:
ReviewGroup GetReviewGroupFromBatchCode(string batchCode);
Run Code Online (Sandbox Code Playgroud)
如果用户无法访问ReviewGroup,则它将返回null,然后OnAuthorization拒绝访问.
现在,我知道装饰动作方法只有在OnAuthorization通过时才会执行,但我不想再次访问数据库以再次获取ReviewGroup.
我正在考虑将ReviewGroup存储在控制器中HttpContext.Items["reviewGroup"]并从控制器访问它.
这是一个可行的解决方案,还是我走错了路?
谢谢!
我有3个型号[用户,角色和用户角色]
Use {ID [PK], Name, Email, Password, .....}
Role {ID [PK], Name, Description, .......}
UserRole {UserID [FK], RoleID [FK]}
考虑使用[Authorize]属性在控制器上进行基于角色的授权,指定用户必须具有管理员角色才能访问类中的任何控制器操作
[Authorize(Roles = "Administrator")]
public class PageController : Controller
{
// Controller code here
}
Run Code Online (Sandbox Code Playgroud)
这很好,我需要的是,
有没有办法将我的角色集分配给[授权]属性?例如
我将从登录用户中获取已分配的角色并将其存储在列表中.是否可以将此列表分配给[授权]属性?如下所示:
[Authorize(Roles = MyDynamicallyLoadedList)]
public class PageController : Controller
{
// Controller code here
}
Run Code Online (Sandbox Code Playgroud) 我一直在研究保护MVC 5应用程序的最佳方法.
我们有一个带有许多WebAPI控制器的Web.csproj以及一个有两个区域的MVC站点 - 一个用于Admin,然后用于面向公众的网站.
阅读本文后说明基本控制器是最好的方法,我决定采用这种方法.
但是,我个人对使用基本控制器并不行(对于我的一些推理,请参阅此stackoverflow答案).
因此,鉴于我正在使用MVC 5(ASP.Net身份和OWIN身份验证) - 任何人都可以了解每种方法的优缺点吗?
asp.net-mvc ×4
c# ×3
asp.net ×2
owin ×2
.net ×1
actionmethod ×1
attributes ×1
authorize ×1
controller ×1
iis ×1
request ×1
role-based ×1
roleprovider ×1
webforms ×1