Web API 的基于角色的身份验证不起作用

     2023-04-13     261

关键词:

【中文标题】Web API 的基于角色的身份验证不起作用【英文标题】:Role Based Authentication for web API not working 【发布时间】:2020-12-21 16:59:40 【问题描述】:

我在为 Web APi 使用基于角色的身份验证时遇到问题。

我有一个控制器类,其中控制器有一个名为 Myauthorize 的自定义授权属性。 我在控制器中有一个方法,只能通过管理员访问权限访问。 但是同样的方法也一直在使用 QA 访问权限进行调用。 有人可以帮忙解决以下问题吗?

请在下面找到代码。 控制器:

namespace Hosiptal.Controllers.office

 [MyAuthorize(Constants.Roles.Admin)]
 public class UserRolesController : ApiController
 
    private readonly IRepository<EntityModels.Role> rolesRepository;

    public UserRolesController(IRepository<EntityModels.Role> rolesRepository)
                
        this.rolesRepository = rolesRepository;
    

    // GET: Users
    [HttpGet]
    [Route("")]        
    public IEnumerable<Role> GetAll()
    
        return this.rolesRepository.GetAll()
            .ToArray()
            .Select(r => Mapper.Current.Get<Role>(r));                
    
  

MyAuthorize 已跟进。

namespace Hospital.Web.Filters.WebApi


 public class MyAuthorize: AuthorizeAttribute
 
    private readonly string[] allowedroles;
    private static IUserProfileRepository UserProfileRepository
    
        get  return IoC.Current.Resolve<IUserProfileRepository>(); 
    
    public MyAuthorize(params string[] roles)
    
        this.allowedroles = roles;
    

    public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken 
      cancellationToken)
    
        var claimsIdentity = actionContext.RequestContext.Principal.Identity as ClaimsIdentity;
        
        var alias = claimsIdentity.Name.Split('@')[0];
        if (alias == null)
        
            throw new ArgumentNullException(nameof(actionContext));
        
        user(alias);
        return base.OnAuthorizationAsync(actionContext, cancellationToken);
    

    public static GenericPrincipal user(string userName)
    
        userName = userName.ToUpper();

        var userProfile = UserProfileRepository.Get(userName) ?? new UserProfile()
        
            UserName = userName,
            Roles = new List<Role>(),
            FirstLoginDateUtc = DateTime.UtcNow
        ;
        return CreatePrincipal(userProfile);
    
    public static GenericPrincipal CreatePrincipal(UserProfile user)
    
        var identity = new ClaimsIdentity(new[]  new Claim(ClaimTypes.Name, 
                           user.UserName) , "Custom");
        return new GenericPrincipal(identity, user.Roles.Select(i => 
              i.Name).ToArray());
    
   
 

如何根据访问级别在此处限制用户?

【问题讨论】:

如果您没有将调用的值分配给任何东西,为什么还要使用user(alias); 创建用户? 你有它的方式,你还不如使用[Authorize(Roles = "role1, role2, role3")] @insane_developer 是的,我还有其他可以通过多个角色访问的控制器。 @JuanR ,对不起,我已经添加了 user(alias) 方法的代码。请您检查一次。我不了解这里的角色机制。你能帮忙吗? @Naurtosan 你试过[Authorize(Constants.Roles.Admin)]吗?那应该做你需要的。我认为除了检查管理员角色之外,您还需要一些东西,这就是这样做的。 【参考方案1】:

如果您查看 the source code 中的 AuthorizeAttribute 类,您会发现它使用控制器上下文请求的主体来执行授权,因此请改写 IsAuthorized 方法,将代码移到那里并分配您创建的主体到上下文请求的主体:

protected override bool IsAuthorized(HttpActionContext actionContext)

    var claimsIdentity = actionContext.RequestContext.Principal.Identity as ClaimsIdentity;

    var alias = claimsIdentity.Name.Split('@')[0];
    if (alias == null)
    
        throw new ArgumentNullException(nameof(actionContext));
    
    
    //This sets the context's principal so the base class code can validate
    actionContext.ControllerContext.RequestContext.Principal = user(alias);
    
    //Call the base class and let it work its magic
    return base.IsAuthorized(actionContext);

我将不对设计本身发表评论。这应该可以解决您的问题。

【讨论】:

谢谢,@JuanR。该修复程序正在运行。这么晚才回复很抱歉。你救了我。并且请始终与像我这样的菜鸟分享知识:)。 @Naurtosan 不用担心。我很高兴能够提供帮助。【参考方案2】:

这对我有用

public class AdminAuthorizeAttributee : AuthorizeAttribute


    public override void OnAuthorization(HttpActionContext actionContext)
    
        if (AuthorizeRequest(actionContext))
        
            return;
        
        HandleUnauthorizedRequest(actionContext);
    

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
    
        base.HandleUnauthorizedRequest(actionContext);
    

    private bool AuthorizeRequest(HttpActionContext actionContext)
    
        try
        
            var username = HttpContext.Current.User.Identity.Name;
            var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var user = userManager.Users.Where(a => a.UserName == username).FirstOrDefault();
            var rolesForUser = userManager.GetRoles(user.Id);
            var role = "Admin";



            if (rolesForUser.Contains(role))
            
                return true;
            
            return false;
        
        catch (Exception ex)
        
            return false;
        

    


在控制器中

[AdminAuthorizeAttributee]
public class YOUR_Controller : ApiController

【讨论】:

我正在寻找的是基于角色的身份验证 这是基于角色的身份验证,此功能userManager.GetRoles 将为您提供用户所在的所有角色。 如果您正在寻找基于声明的身份验证,这将不起作用! 这不是 [Authorize(Constants.Roles.Admin)] 开箱即用的吗?只有管​​理员角色的用户有权访问资源。我已经反复这样做了。我在这里错过了什么? 不确定,我总是这样。【参考方案3】:

您无需为此创建自己的授权过滤器。 使用内置的[Authorize(Roles = "Admin")] - 这将检查用户是否有一个名为“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”的声明,以及该值是否与那个匹配你输入那个授权属性,授权就会成功。

因此,在您的情况下,请确保当您登录用户以使用如下角色设置他的声明时:

            var claims = new List<Claim>()
            
                new Claim(ClaimTypes.Role, "Admin"), //here set the users role
                     // ... other claims
            ;

ClaimTypes 类来自命名空间System.Security.Claims

然后[Authorize(Roles = "Admin")] 应该可以正常工作

【讨论】:

我正在处理 Web API 授权。因此,只有在 myauthorize 类中,我才能将角色分配给用户。但有些地方会失败。 你能分享你如何“登录”用户的代码吗?您如何在该操作中分配声明? 如您在上面的代码中看到的,我们有通过传递一些 Jwt 令牌来调用它们的 api。将角色分配给用户的 Myauthorize 类中的代码。但是 Api 在没有管理员权限的情况下一直在调用。

基于角色的授权身份 API - 注册不起作用

】基于角色的授权身份API-注册不起作用【英文标题】:RoleBasedAuthorizationIdentityAPI-registrationnotworking【发布时间】:2020-07-2714:51:04【问题描述】:我一直在关注一个Youtube视频:https://www.youtube.com/watch?v=IBpZCFbjvA0使用身份API为我的asp.... 查看详情

(Monaca,Cordova)带有表单身份验证(Cookie)的 Web API 请求不起作用

】(Monaca,Cordova)带有表单身份验证(Cookie)的WebAPI请求不起作用【英文标题】:(Monaca,Cordova)WebAPIrequestwithformauthentication(Cookie)notworking【发布时间】:2020-05-1515:34:39【问题描述】:我有一个关于我的应用程序和WebAPI发布的问题... 查看详情

基于 JSF 表单的身份验证 + 托管 Bean 登录不起作用

】基于JSF表单的身份验证+托管Bean登录不起作用【英文标题】:JSFFormBasedAuthentication+ManagedBeanloginnotworking【发布时间】:2014-06-0104:14:23【问题描述】:我想在JavaEE6Turorial之后实现托管Bean表单基本身份验证我必须配置和构建所有必... 查看详情

Sharepoint 区域身份验证不起作用

...发布时间】:2014-09-0405:06:56【问题描述】:我有一个使用基于声明的身份验证的Sharepoint2010Web应用程序。它包含三个区域(两个扩展)。第一个,主要区域工作正常。第二个(内部网)要求提供凭据,但不进行身份验证。第三个... 查看详情

Asp.net Web 应用程序基于角色的身份验证

】Asp.netWeb应用程序基于角色的身份验证【英文标题】:Asp.netWebApplicationRolebasedauthentication【发布时间】:2020-03-0418:19:52【问题描述】:我是Asp.net的新手,我一直在尝试创建一个简单的基于事务的系统,其中不同角色的用户将有... 查看详情

如何制作和使用基于 JWT 角色的身份验证?

】如何制作和使用基于JWT角色的身份验证?【英文标题】:HowdoImakeanduseJWTrolebasedauthentication?【发布时间】:2020-08-0609:51:33【问题描述】:我按照下面的教程链接。https://fullstackmark.com/post/13/jwt-authentication-with-aspnet-core-2-web-api-angula... 查看详情

Spring Security 基于角色的授权问题

】SpringSecurity基于角色的授权问题【英文标题】:SpringSecurityrole-basedauthorisationissue【发布时间】:2016-07-0121:11:23【问题描述】:我已经在我的应用程序中实现了SpringSecurity。它是基于无状态令牌的身份验证和基于用户名/密码的身... 查看详情

ASP.NET Core WebApi Jwt 基于角色的授权不起作用

】ASP.NETCoreWebApiJwt基于角色的授权不起作用【英文标题】:ASP.NETCoreWebApiJwtRole-basedAuthorizationnotworking【发布时间】:2019-09-2919:06:00【问题描述】:我已经根据一个教程实现了一个JWT身份验证/授权系统。但不幸的是,我不知道如何... 查看详情

phonegap:基于 cookie 的身份验证 (PHP) 不起作用 [webview]

】phonegap:基于cookie的身份验证(PHP)不起作用[webview]【英文标题】:phonegap:cookiebasedauthentication(PHP)notworking[webview]【发布时间】:2011-04-1204:18:34【问题描述】:我正在开发一个使用senchatouch、HTML5和phonegap作为包装器的移动网络应用... 查看详情

ASP.NET Web 应用程序中基于 Windows 身份验证的角色管理

】ASP.NETWeb应用程序中基于Windows身份验证的角色管理【英文标题】:WindowsauthenticationbasedrolemanagementinASP.NETWebApplication【发布时间】:2012-06-2915:10:35【问题描述】:我不太确定我是否在ASP.NET应用程序中适当地管理用户角色。这样的... 查看详情

是否可以在没有 web.sitemap 的情况下进行基于 ASP.NET 角色的表单身份验证和授权?

】是否可以在没有web.sitemap的情况下进行基于ASP.NET角色的表单身份验证和授权?【英文标题】:IsitPossibletohaveASP.NETrolebasedformauthenticationandauthorizationwithoutweb.sitemap?【发布时间】:2017-12-2303:00:49【问题描述】:我制作了一个ASP.NET4.... 查看详情

针对 Spring Boot API 的 Android 身份验证不起作用

】针对SpringBootAPI的Android身份验证不起作用【英文标题】:AndroidauthenticationagainstSpringBootAPInotworking【发布时间】:2020-12-1216:31:56【问题描述】:我有一个使用Auth0JWT身份验证的SpringBoot后端API,目前有两个客户端,一个VueSPA和一个A... 查看详情

基于 Cookie 的身份验证和 Web API

】基于Cookie的身份验证和WebAPI【英文标题】:Cookie-basedauthenticationandwebAPI【发布时间】:2014-05-2817:21:53【问题描述】:我正在为我的服务构建一个公共WebAPI。网页和原生移动应用程序(iOS、Android和Windows8)同样会使用它。我应该... 查看详情

Web API 中基于令牌的身份验证,无需任何用户界面

】WebAPI中基于令牌的身份验证,无需任何用户界面【英文标题】:TokenbasedauthenticationinWebAPIwithoutanyuserinterface【发布时间】:2016-12-0407:19:27【问题描述】:我正在用ASP.NetWebAPI开发一个RESTAPI。我的API只能通过非基于浏览器的客户端... 查看详情

基于角色的 jwt 授权

】基于角色的jwt授权【英文标题】:Rolebasedjwtauthorization【发布时间】:2017-12-1423:43:54【问题描述】:我正在尝试使用JSONWeb令牌对Node.jsAPI进行身份验证。我可以生成令牌对用户进行身份验证。现在我需要根据用户角色保护我的API... 查看详情

Windows 身份验证在 Flex 中不起作用

】Windows身份验证在Flex中不起作用【英文标题】:WindowsAuthenticationisnotworkinginFlex【发布时间】:2011-02-0223:02:00【问题描述】:我们有一种情况,即Intranet中的Web应用程序需要Windows身份验证。通过这种方式,公司的员工可以登录到... 查看详情

IdentityServer4 基于角色的 Web API 授权与 ASP.NET Core 身份

】IdentityServer4基于角色的WebAPI授权与ASP.NETCore身份【英文标题】:IdentityServer4RoleBasedAuthorizationforWebAPIwithASP.NETCoreIdentity【发布时间】:2019-05-2708:13:48【问题描述】:我将IdentityServer4与.NetCore2.1和Asp.NetCoreIdentity一起使用。我的解决... 查看详情

从 android 设备生成的 Linkedin 身份验证令牌在 Web 服务器上不起作用

】从android设备生成的Linkedin身份验证令牌在Web服务器上不起作用【英文标题】:Linkedinauthtokengeneratedfromandroiddeviceisnotworkingonwebserver【发布时间】:2013-12-1310:42:36【问题描述】:我正在尝试使用linkedin-j-android库获取LinkedIn用户访问... 查看详情