繁体   English   中英

ASP.NET Web API中基于角色的授权-如何在主体上设置角色?

[英]Role-based authorization in ASP.NET Web API - how to set roles on the principal?

我在新发行的《 ASP.NET Web Api 2食谱》中使用食谱10-3,以支持Web API中的基本身份验证。 该食谱使用了Thinktecture的第3方库。 从下面的代码可以看出,我正在根据自己的帐户服务对用户进行身份验证。

using Thinktecture.IdentityModel.WebApi.Authentication.Handler;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...            

        var authenticationConfiguration = new AuthenticationConfiguration();
        var accountService = ServiceLocator.Get<AccountService>();
        authenticationConfiguration.AddBasicAuthentication((userName, password) => accountService.Authenticate(userName, password));
        config.MessageHandlers.Add(new AuthenticationHandler(authenticationConfiguration));

        ...
   }
}

现在,我想使用Authorize属性在控制器中进行基于角色的授权:

[Authorize(Roles="administrator")]
public IHttpActionResult Get()
{
    ...
}

我的帐户服务显然知道用户及其分配的角色,但是“授权”权限不可用此信息(角色未在主体上设置)。

我该如何完成? 是否可以将Thinktecture身份验证处理程序配置为在主体上设置角色? 还是我应该制作自己的自定义Authorize属性(从Authorize属性派生)? 如果是这样,我是否应该重写OnAuthorization方法来使用我的帐户服务创建和设置主体? 还是直接重写IsAuthorized方法? 也许还有别的...

AuthenticationHandler仅执行身份验证。 您需要在单独的步骤中设置角色(例如,在委派处理程序中)。

如果您使用的是Web API v2,则建议您切换到基本的auth OWIN中间件

https://github.com/thinktecture/Thinktecture.IdentityModel/tree/master/source/Thinktecture.IdentityModel.Owin.BasicAuthentication

这使您可以完全控制要创建的主体。

https://github.com/thinktecture/Thinktecture.IdentityModel/blob/master/samples/OWIN/AuthenticationTansformation/KatanaAuthentication/Startup.cs

还有一个小事。

我发现AddBasicAutentication方法实际上有一个重载,该重载需要委托来提供角色。 这正是我想要的。 因此,现在对AddBasicAuthentication的调用看起来像这样,并且一切工作都像一个超级按钮:

authenticationConfiguration.AddBasicAuthentication((userName, password) => accountService.Authenticate(userName, password), (username) => accountService.GetRoles(username));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM