我想知道是否/如何覆盖ASP.NET MVC中的默认[Authorize]行为.我知道我可以创建一个新的Action Filter,创建自己的属性等等; 我只是感兴趣,如果我可以简单地更改[授权]行为并用我自己的代码替换它的工作?
编辑:男孩和女孩.感谢您的意见,但正如我所写,我不打算引入新的[XYZAuthorize]属性.我知道怎么做.我想保留[授权]符号,但只是改变它的工作原理.
也许在进入标题问题之前我应该备份并扩大范围......
我目前正在ASP.NET MVC 1.0中编写一个Web应用程序(虽然我的PC上安装了MVC 2.0,所以我并不完全限于1.0) - 我已经开始使用标准的MVC项目了基本的"欢迎使用ASP.NET MVC",并在右上角显示[Home]选项卡和[About]选项卡.很标准,对吗?
我添加了4个新的Controller类,我们称之为"天文学家","生物学家","化学家"和"物理学家".附加到每个新控制器类的是[Authorize]属性.
例如,对于BiologistController.cs
[Authorize(Roles = "Biologist,Admin")]
public class BiologistController : Controller
{
public ActionResult Index() { return View(); }
}
Run Code Online (Sandbox Code Playgroud)
这些[授权]标签自然限制哪些用户可以根据角色访问不同的控制器,但我想根据用户所属的角色在Site.Master页面的网站顶部动态构建一个菜单.例如,如果"JoeUser"是角色"天文学家"和"物理学家"的成员,导航菜单会说:
[主页] [天文学家] [物理学家] [关于]
当然,它不会列出"生物学家"或"化学家"控制器索引页面的链接.
或者,如果"JohnAdmin"是角色"Admin"的成员,则所有4个控制器的链接将显示在导航栏中.
好吧,你们大家都有了想法......现在回答真正的问题......
从这个关于ASP.NET中动态菜单构建的StackOverflow主题的答案开始,我试图理解如何完全实现它.(我是新手,需要更多指导,所以请和我一起去.)
答案建议扩展Controller类(称之为"ExtController"),然后让每个新的WhateverController继承自ExtController.
我的结论是我需要在这个ExtController构造函数中使用Reflection来确定哪些类和方法附加了[Authorize]属性来确定角色.然后使用静态字典,将角色和控制器/方法存储在键值对中.
我想它是这样的:
public class ExtController : Controller
{
protected static Dictionary<Type,List<string>> ControllerRolesDictionary;
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// build list of menu items based on user's permissions, and add it to ViewData
IEnumerable<MenuItem> menu = BuildMenu();
ViewData["Menu"] …Run Code Online (Sandbox Code Playgroud) 我一直在互联网上试图找出为什么我的自定义AuthorizeAttribute在我的MVC WebApi中不起作用.我见过人们在SO上询问这类事情但是没有什么能帮助我解决我的问题:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false,
Inherited = false)]
public sealed class CustomAuthorization : AuthorizeAttribute
{
//...
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// custom auth logic, returns true if authorized, false otherwise
}
}
Run Code Online (Sandbox Code Playgroud)
我正在延伸System.Web.Mvc而不是System.Web.Http.但是,我AuthorizeCore(HttpContextBase httpContext)永远不会被召唤.
我的类中有一个构造函数,CustomAuthorization它接受params string[]一个特定操作所需的自定义权限的名称,例如:
[CustomAuthorization("Some Permission")]
[System.Web.Http.HttpGet]
public CustomResponse SomeAction()
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我希望实现的是每当请求使用该[CustomAuthorization]属性修饰的动作时都会触发我的授权代码.如果授权失败,我还希望能够返回更具描述性的auth失败消息.不只是:
{"Message":"Authorization has been denied for this request."}
Run Code Online (Sandbox Code Playgroud)
我相信这涉及到覆盖HandleUnauthorizedRequest但是我如何才能提供我自己的JSON响应将序列化的对象?
总而言之,即使我用我的[CustomAuthorization]属性修饰动作,框架也不会调用我的授权代码.它只是直接执行操作中的代码.
其次,如何实现未经授权的响应来序列化自定义JSON对象?
感谢您提前的帮助,非常感谢!
c# asp.net-mvc authorize-attribute asp.net-mvc-4 asp.net-web-api
有人可以解释为什么授权属性生命周期似乎是相对于它应用的类或方法进行管理的?这与相对于请求生命周期进行管理相反.
如果我在类级别修饰控制器,则只有在对同一个控制器的多个请求中调用一次授权属性构造函数.如果我装饰每个控制器方法,那么我会为每个调用的控制器方法获取新的authorize属性构造函数调用.
什么是这种行为?我希望每个请求都能创建授权属性.
我有一个非常简单的场景.我想用自定义授权属性装饰我的控制器/操作.如果任何属性有效,则应授予授权.例如,
[MyAuth(1)]
[MyAuth(2)]
public class MyController : Controller
{
...
}
Run Code Online (Sandbox Code Playgroud)
我无法将参数组合到单个授权属性中.以上示例仅是一个简化示例.
如果任一属性授权用户,我希望用户获得授权.我认为ActionFilterAttribute或者AuthorizeAttribute有办法看看其他过滤器已被执行并等待执行,但没有这样的运气.
我怎么能做到这一点?由于属性似乎没有任何意识,也许是HttpModule?一个习惯ControllerActionInvoker?
我在一个位在ASP.NET MVC与实施角色绑定5.我试图登录为不具有访问我试图达到应用领域所需的角色的用户.我在这种情况下的期望是,我再次被重定向到登录页面,直到我输入一组有访问权限的凭据或我导航到应用程序的另一个区域.
实际发生的是应用程序似乎进入登录重定向循环,调试通过显示多次调用Login操作.
这是登录操作:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
Run Code Online (Sandbox Code Playgroud)
这会导致IIS生成错误:
HTTP Error 404.15 - Not Found
The request filtering module is configured to deny a request where the query string is too long.
Run Code Online (Sandbox Code Playgroud)
查询字符串如下所示:
http://localhost/MyApplication/Account/Login?ReturnUrl=%2FMyApplication%2FAccount%2FLogin%3FReturnUrl%3D%252FMyApplication%252FAccount%252FLogin%253FReturnUrl%253D%25252FMyApplication%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FMyApplication%2525252FAccount%2525252FLogin%2525253FReturnUrl%2525253D%252525252FMyApplication%252525252FAccount%252525252FLogin%252525253FReturnUrl%252525253D%25252525252FMyApplication%25252525252FAccount%25252525252FLogin%25252525253FReturnUrl%25252525253D%2525252525252FMyApplication%2525252525252FAccount%2525252525252FLogin%2525252525253FReturnUrl%2525252525253D%252525252525252FMyApplication%252525252525252FAccount%252525252525252FLogin%252525252525253FReturnUrl%252525252525253D%25252525252525252FMyApplication%25252525252525252FAccount%25252525252525252FLogin%25252525252525253FReturnUrl%25252525252525253D%2525252525252525252FMyApplication%2525252525252525252FAccount%2525252525252525252FLogin%2525252525252525253FReturnUrl%2525252525252525253D%252525252525252525252FMyApplication%252525252525252525252FAccount%252525252525252525252FLogin%252525252525252525253FReturnUrl%252525252525252525253D%25252525252525252525252FMyApplication%25252525252525252525252FAccount%25252525252525252525252FLogin%25252525252525252525253FReturnUrl%25252525252525252525253D%2525252525252525252525252FMyApplication%2525252525252525252525252FAccount%2525252525252525252525252FLogin%2525252525252525252525253FReturnUrl%2525252525252525252525253D%252525252525252525252525252FMyApplication%252525252525252525252525252FAccount%252525252525252525252525252FLogin%252525252525252525252525253FReturnUrl%252525252525252525252525253D%25252525252525252525252525252FMyApplication%25252525252525252525252525252FAccount%25252525252525252525252525252FLogin%25252525252525252525252525253FReturnUrl%25252525252525252525252525253D%2525252525252525252525252525252FMyApplication%2525252525252525252525252525252FAccount%2525252525252525252525252525252FLogin%2525252525252525252525252525253FReturnUrl%2525252525252525252525252525253D%252525252525252525252525252525252FMyApplication%252525252525252525252525252525252F
Run Code Online (Sandbox Code Playgroud)
我从一个有效的解决方案(尽管没有基于角色的授权)到我当前破碎的情况所做的唯一改变是在成功登录时重定向到的控制器上面添加了以下内容:
[Authorize(Roles = "Staff")]
Run Code Online (Sandbox Code Playgroud)
正如我之前所说,我登录的用户不是这个角色,但我希望在没有循环的情况下,理智,单一重定向到Login.
编辑:请求bu @dima,通过过滤器应用授权的详细信息......我有以下内容:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我已经使用和不使用此行测试了应用程序,并且重定向循环继续有增无减.
asp.net-mvc authorize-attribute asp.net-roles asp.net-identity
AuthorizeAttribute要求您覆盖OnAuthorization方法,IAuthorizationFilter要求您实现OnAuthorization方法.对我来说似乎是一样的东西,还有其他差异吗?为什么一个用于另一个?
编辑:澄清一下,我试图了解以下两段代码之间的区别.
public class PasswordExpirationCheckAttribute : AuthorizeAttribute
{
private int _maxPasswordAgeInDays;
public PasswordExpirationCheckAttribute(int maxPasswordAgeInDays)
{
_maxPasswordAgeInDays = maxPasswordAgeInDays;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.ActionDescriptor.GetCustomAttributes(typeof(BypassPasswordExpirationCheckAttribute), true).Any())
{
IPrincipal userPrincipal = filterContext.RequestContext.HttpContext.User;
if (userPrincipal != null && userPrincipal.Identity.IsAuthenticated)
{
var userStore = new ApplicationUserStore(new IdentityDb());
var userManager = new ApplicationUserManager(userStore);
var user = userManager.FindByNameAsync(filterContext.RequestContext.HttpContext.User.Identity.Name).Result;
if (user != null)
{
var timeSpan = DateTime.Today.Date - user.LastPasswordChangedDate.Date;
if (timeSpan.TotalDays >= _maxPasswordAgeInDays)
{
HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current);
RequestContext requestContext = new …Run Code Online (Sandbox Code Playgroud) 我打算使用下面的代码来实现我的web api安全性,但我不确定这是否足够安全和合理.我不想使用OWIN和AspNet.Identity,因为它对我来说非常复杂,我不完全理解,我不知道我如何定制数据库表,用户角色等.但我的方式很简单,非常可定制我.
这是CustomAuthorizeAttribute;
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if ((actionContext.Request.Headers.GetValues("Host").FirstOrDefault().Contains("localhost:15742")))
{
IEnumerable<string> access_token;
if (actionContext.Request.Headers.TryGetValues("Authorization", out access_token))
{
var user = GetUserByToken(access_token);
if (user!=null && !user.TokenIsExpired)
{
HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom " + access_token.FirstOrDefault());
return;
}
else
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom");
return;
}
}
else
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
}
}
else
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是前端使用
<script type="text/javascript">
$(function () {
var access_token = $.cookie('access_token');
if (access_token == undefined) …Run Code Online (Sandbox Code Playgroud) asp.net restful-authentication authorize-attribute custom-authentication asp.net-web-api
任何人都可以向我解释这两个属性的差异和用例吗?我很困惑,因为他们的行为相似.
我知道[Authorize]挂钩到ASP.NET应用程序生命周期并在请求到达Controller/Action之前运行.PrincipalPermission怎么样?
[PrincipalPermission(SecurityAction.Demand, Role="Admin")]
Run Code Online (Sandbox Code Playgroud)
和
[Authorize(Roles="Admin")]
Run Code Online (Sandbox Code Playgroud) 每当我在用户控制器上使用授权属性时,我都会收到 cors 策略错误。我使用 Angular 8 作为我的前端框架,使用 asp .net core 3.0.0 作为我的后端。如果我删除授权属性,它工作正常来自控制器。
。下面是我的startup.cs文件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using AutoMapper;
using DatingApp.API.Data;
using DatingApp.API.Helpers;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace DatingApp.API {
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called …Run Code Online (Sandbox Code Playgroud) c# authorize-attribute asp.net-core asp.net-core-3.0 angular8
asp.net-mvc ×6
c# ×6
asp.net ×2
.net ×1
angular8 ×1
asp.net-core ×1
attributes ×1
reflection ×1