- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了自定义授权处理程序来确定用户是否有权编辑或删除资源。
但是处理程序从未被调用,当我尝试编辑资源时,我总是得到 401 状态代码。
这是我的自定义处理程序:
public class MeetingAuthorizationHandler : AuthorizationHandler<SameCreatorRequirement, Meeting>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SameCreatorRequirement requirement, Meeting resource)
{
/*if (context.User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).FirstOrDefault() != null)
{
int idCreator = Int32.Parse(context.User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).FirstOrDefault().Value);
if(idCreator == resource.CreatedBy.IdUserPreferences)
{
context.Succeed(requirement);
}
}*/
context.Succeed(requirement);
return Task.CompletedTask;
}
}
public class SameCreatorRequirement : IAuthorizationRequirement
{
}
我还在配置方法中添加了这些行:
services.AddSingleton<IAuthorizationHandler, MeetingAuthorizationHandler>();
services.AddAuthorization(options =>
{
options.AddPolicy("Admin", policy => policy.RequireClaim("Admin"));
options.AddPolicy("EditPolicy", policy => policy.Requirements.Add(new SameCreatorRequirement()));
});
在 Controller 中,我使用这个:
[Route("Meetings/Edit/{id}")]
[Authorize(Policy = "EditPolicy")]
public async Task<IActionResult> Edit(int id)
我已经阅读了很多相关的帖子,并且找到了它不起作用的原因。这段代码有什么问题?
我在输出中找到了这个(我使用没有身份的 Cookie 身份验证,请参阅 this)
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization was successful.
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization failed.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.ForbidResult:Information: Executing ForbidResult with authentication schemes ().
Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler:Information: AuthenticationScheme: Cookies was forbidden.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action RoomScheduling.Controllers.MeetingsController.Edit (RoomScheduling) in 21.4851ms
这是我的 Controller :
namespace RoomScheduling.Controllers
{
[Authorize]
public class MeetingsController : Controller
{
/** ------------------- **/
[Route("Meetings/Edit/{id}")]
[Authorize(Policy = "EditPolicy")]
public async Task<IActionResult> Edit(int id)
{
MeetingView meetingView = new MeetingView();
Meeting meeting = await _context.Meeting
.Include(m => m.Room)
.Include(m => m.MeetingType)
.Include(m => m.CreatedBy)
//.Include(m => m.UpdatedBy)
.Include(m => m.Attendees)
.AsNoTracking()
.SingleAsync(m => m.IdMeeting == id);
meeting.UpdatedBy = new UserPreferences();
meeting.UpdatedBy.IdUserPreferences = GetCurrentUserId();
meetingView.Meeting = meeting;
meetingView.Attendees = meeting.Attendees.Select(c => c.Attendant).ToArray();
ViewBag.RoomId = new SelectList(_context.Room.AsNoTracking().Include(m => m.Area).ToList(), "IdRoom", "Name", meeting.Room.IdRoom, "Area.Name"); //Dropdown list
ViewBag.MeetingTypeId = new SelectList(_context.MeetingType.AsNoTracking().ToList(), "IdMeetingType", "Name"); //Dropdown list
ViewBag.AttendeesIdList = new MultiSelectList(_context.Attendees.AsNoTracking().Select(a => a.Attendant).Distinct().ToList(), "", "", meetingView.Attendees);
return View(meetingView);
}
/** ------------------- **/
}
}
最佳答案
问题是您正在尝试对资源进行授权。您的保单不知道如何检索或访问 Meeting
资源。
如果您想在 AuthorizationHandler
中做出决定需要访问 Meeting
您可以注入(inject) IAuthorizationService
的对象进入您的 Controller 并使用您的 Meeting
调用针对该策略的授权资源。
[Route("Meetings/Edit/{id}")]
[Authorize(Policy = "EditPolicy")]
public async Task<IActionResult> Edit(int id)
{
MeetingView meetingView = new MeetingView();
Meeting meeting = await _context.Meeting
.Include(m => m.Room)
.Include(m => m.MeetingType)
.Include(m => m.CreatedBy)
//.Include(m => m.UpdatedBy)
.Include(m => m.Attendees)
.AsNoTracking()
.SingleAsync(m => m.IdMeeting == id);
// Authorize the user against the EditPolicy using the meeting resource.
var result = await _authorizationService.AuthorizeAsync(User, meeting, "EditPolicy");
if (!result.Succeeded)
{
return Forbid();
}
// Do stuff.
}
如果您不想对资源做出授权决定,您可以使用不同的 AuthorizationHandler<TRequirement>
例如:
public class MeetingAuthorizationHandler : AuthorizationHandler<SameCreatorRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SameCreatorRequirement requirement)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
}
关于c# - .NET Core 2.1 - 未达到 AuthorizationHandler 并始终返回 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51554306/
我在 .NET Core 2.1 中使用了基于资源的授权模式,如所述 here .我遇到的唯一问题是我不知道如何干净地测试我的 AuthorizationHandler。 这里有人做过类似的事情吗?
使用 .net 核心应用程序实现自定义策略。 假设我们有一个非常简单的自定义策略: internal class RequireNamePolicy : AuthorizationHandler, I
我们开发了一个基于身份验证的 Multi-Tenancy 应用程序。每个用户都会获得一个存储在数据库中的 token session ,以判断用户是否仍处于连接状态(有过期时间)。我将 token (
在 WCF 中,您可以使用 serviceAuthorization 通过 web.config 添加授权策略。服务行为中的节点。有没有办法包含 AuthorizationHandler在 .NET
我在 ASP.NET Core MVC (dnx46) RC1 中有一个带有 AuthorizationHandler 的应用程序: public class AppSumAuthAuthorizat
我正在尝试创建一个新的授权要求,但它必须使用我在 ConfigureServices 中声明的服务之一,而且我不知道如何使用与声明服务相同的方法将该服务传递给新要求。 public class New
我有一个 AuthorizationHandler,它依赖于为 .NET Core 3.1 的授权中间件提供异步方法的服务。我已经在 HandleRequirementAsync 中调用了其中一些异步
我正在尝试添加一些基于授权的自定义角色,但我无法将 Startup 配置为调用我的 AuthorizationHandler。 在GitHub上找到了一些相关资料:here .这是不是错误? 我正在使
我正在尝试添加自定义授权策略,该策略可以检查 json 配置文件中提供的组分隔列表。我正在使用 ASP.Net 5 - MVC 6 以及 Windows 身份验证。 一切正常,除了我调用 Fail 时
使用 .NET Core 1.1,我创建了一个 AuthorizationHandler: public class HasStoreAccountAuthorizationHandler : Aut
我正在使用授权处理程序将自定义授权放入我在 .net 核心中的 Controller 中。如何从 Controller 获取参数并将其用于授权处理程序? 在旧的 .NET 中,我可以像这样从 Http
我实现了我的自定义 AuthorizationHandler。 对此,我检查用户可以解决并处于事件状态。 如果用户不活跃,那么我想返回 403 状态。 protected override async
我正在使用向第三方服务发出 API 请求的身份验证中间件。然后,该中间件设置声明,稍后由 AuthorizationHandler 结合 IAuthorizationRequirement 和自定义策
我已经实现了自定义授权处理程序来确定用户是否有权编辑或删除资源。 但是处理程序从未被调用,当我尝试编辑资源时,我总是得到 401 状态代码。 这是我的自定义处理程序: public class Mee
我有以下 AuthorizationRequirement 和 AuthorizationHandler 已向 DI 注册并且工作正常。但是,当在 iframe(同源)中调用带有 [Authorize
我为用户登录使用了特定的授权策略,因此创建了自定义授权处理程序。如果政策失败,我想显示使用特定的警报消息。我读了documentation并发现我可以通过转换 AuthorizationHandler
给定以下带有 DI 的 UserManager 类 public class AccountAuthorizationHandler : AuthorizationHandler { priv
嗨,我正在使用身份服务器 4,我创建了一个使用 client_credentials 进行保护的客户端 我可以使用 clientid 和 secret 检索 token ,并且根据 jwt.io,访问
我正在尝试在 .net core 2.0 中实现 AuthorizationHandler 在那里我需要授权用户并根据条件想要重定向到我的应用程序验证中的不同操作方法工作正常但是我如何将用户重定向到拒
我是一名优秀的程序员,十分优秀!