标签: asp.net-authorization

ASP.NET WebApi FormsAuthentication 401(未经授权)问题

我一直在学习ASP.Net WebApi中的授权是如何工作的,我在另一个帖子(ASP.NET Web API身份验证)中遇到了Darin Dimitrov的答案,我需要一些帮助来理解为什么我会得到401.

遵循Darin的代码,我创建了一个WebApi项目并添加了以下控制器和模型:

AccountController.cs

using System.Web.Http;
using System.Web.Security;
using AuthTest.Models;

namespace AuthTest.Controllers
{
    public class AccountController : ApiController
    {
        public bool Post(LogOnModel model)
        {
            if (model.Username == "john" && model.Password == "secret")
            {
                FormsAuthentication.SetAuthCookie(model.Username, false);
                return true;
            }

            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

UsersController.cs

using System.Web.Http;

namespace AuthTest.Controllers
{
    [Authorize]
    public class UsersController : ApiController
    {
        public string Get()
        {
            return "This is top secret material that only authorized users can see";
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# authorization asp.net-authorization asp.net-web-api

2
推荐指数
1
解决办法
7199
查看次数

如何在ASP.NET Core 2中引发ForbiddenException,而不是使用AccessDeniedPath

我正在研究ASP.NET Core 2 Web应用程序。我正在处理[授权(角色或策略)]页面的“ 访问被拒绝页面。

默认情况下,ASP.NET Core 2.0 不会显示原始URL并返回403状态,而是将请求重定向到状态为302- >这不是我想要的AccessDenied页面。

而不是重定向AccessDenied页面。我希望ASP.NET Core抛出自定义的ForbiddenException异常,以便像处理未处理的异常一样处理未经授权的访问。

这是我的身份验证配置:

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; // Cookies
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; // Cookies       
    options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; // Cookies
})
.AddCookie(options => {

    options.LoginPath = "/Auth/Login/";
    options.LogoutPath = "/Auth/Logout/";

    // I want disable this and throw ForbiddenException instead.
    options.AccessDeniedPath = "/Auth/AccessDenied/";  
});
Run Code Online (Sandbox Code Playgroud)

有人有帮助吗?谢谢!

c# authorize-attribute asp.net-authorization asp.net-core asp.net-core-2.0

2
推荐指数
1
解决办法
1783
查看次数

只授权ASP.NET Core中的某些Http方法

我想对控制器上的所有操作都要求一个策略,并且对HTTP“编辑方法”(POST,PUT,PATCH和DELETE)的所有调用都需要第二个策略。也就是说,编辑方法应同时要求两个策略。由于实现要求,以及保持代码DRY的愿望,我需要将后者策略应用于控制器级别,而不是在所有操作方法上都重复使用。

举一个简单的例子,我有一个PeopleController,我也有两个许可权,分别实现为Policy ViewPeopleEditPeople。现在我有:

[Authorize("ViewPeople")]
public class PeopleController : Controller { }
Run Code Online (Sandbox Code Playgroud)

如何添加EditPeople策略/权限,使其“堆叠”且仅适用于编辑动词?

我遇到了两个似乎都是很痛苦的问题:

  • 您不能在AuthorizeAttribute AFAIK中指定一个以上的AuthorizeAttribute或一个以上的策略。
  • 您无法在自定义AuthorizationHandler中访问该请求,因此我无法检查HttpMethod进行检查。

我尝试使用自定义Requirement和AuthorizationHandler解决前者,如下所示:

public class ViewEditRolesRequirement : IAuthorizationRequirement
{
    public ViewEditRolesRequirement(Roles[] editRoles, Roles[] viewRoles)
        => (EditRoles, ViewRoles) = (editRoles, viewRoles);

    public Roles[] EditRoles { get; }
    public Roles[] ViewRoles { get; }
}

public class ViewEditRolesHandler : AuthorizationHandler<ViewEditRolesRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ViewEditRolesRequirement requirement)
    {
        if (context.User != null)
        {
            var canView = requirement.ViewRoles.Any(r => context.User.IsInRole(r.ToString()));
            var …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-authorization asp.net-core asp.net-core-identity

1
推荐指数
1
解决办法
620
查看次数

Razor 视图中的 ASP.Net MVC 自定义授权策略提供程序

对于某些应用程序,我需要一个自定义授权策略提供程序,并点击此链接,并能够成功创建一个在控制器中工作的授权策略提供程序。现在,当涉及到视图时,在基于角色的授权中,您可以简单地使用该术语@if (User.IsInRole("SomeRole"))来显示或隐藏 div 和资源。

如何在视图中使用自定义授权策略提供程序来确定给定用户是否可以根据策略评估查看内容?

我搜索了网络,找不到有关它的有用信息,并尝试与

@if ((await AuthorizationService.AuthorizeAsync(User, "PolicyName")).Succeeded)
Run Code Online (Sandbox Code Playgroud)

但这也并不成功——它也不是一项政策。

以前有人这样做过吗?

更新

我在控制器中使用自定义策略提供程序,如下所示:

[MinimumAgeAuthorize(15)]
public IActionResult Index()
{
       //some code
}
Run Code Online (Sandbox Code Playgroud)

我不能做

@if ((await AuthorizationService.AuthorizeAsync(User, "MinimumAgeAuthorize(15)")).Succeeded)
Run Code Online (Sandbox Code Playgroud)

在剃刀视图中它的等价物是什么?

c# model-view-controller authorization asp.net-authorization asp.net-core-mvc

1
推荐指数
1
解决办法
1873
查看次数

动态添加 Blazor 授权的策略声明

我正在创建一个用于内部授权目的的身份验证和授权处理程序。我的目的是让我的同事能够轻松地将解决方案实施到他们自己的项目中。我们使用 Azure AD 进行身份验证,并使用 Azure 组进行授权。为了做到这一点,我觉得我一直在思考如何以有效的方式添加授权策略。

现在,我正在 Blazor WebAssembly 托管配置中的 Client 项目的 Program 类中通过官方描述的方式添加它:

            builder.Services.AddAuthorizationCore(options =>
                options.AddPolicy("PolicyName", policy =>
                {
                    policy.RequireClaim("ClaimType", "ClaimValue");
                })
            );
Run Code Online (Sandbox Code Playgroud)

这工作正常,但并不直观,因为任何给定的项目可能需要几种不同的策略

我还添加了一个自定义授权策略提供程序,如 Microsoft 的此文档中所述:

https://learn.microsoft.com/en-us/aspnet/core/security/authorization/iauthorizationpolicyprovider?view=aspnetcore-6.0

根据他们对该文档的描述,尤其是文档中的前几行,我认为这就是我正在寻找的内容。但如果没有专门手动添加每个策略,我似乎仍然无法让它按预期工作。

如果需要,我可以展示我的授权策略提供程序的自定义实现,但它与 Github 中的文档几乎完全相同。

authentication asp.net-authorization azure-authentication hosted-blazor-webassembly

1
推荐指数
1
解决办法
2141
查看次数