我在新发布的书籍ASP.NET Web Api 2 Recipes中使用配方10-3来支持我的Web API中的基本身份验证。该配方使用了Thinktecture的第三方库。从下面的代码可以看出,我根据自己的帐户服务对用户进行身份验证。
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方法?或者其他可能......
答案 0 :(得分:3)
AuthenticationHandler仅进行身份验证。您需要在单独的步骤中设置角色(例如,在委托处理程序中)。
如果您使用的是Web API v2 - 我建议切换到基本的auth OWIN中间件
这使您可以完全控制创建的主体。
还有一个nuget。
答案 1 :(得分:2)
我发现AddBasicAutentication方法实际上有一个重载,它需要一个委托来提供角色。这正是我所寻找的。所以现在调用AddBasicAuthentication看起来像这样,一切都像魅力一样:
authenticationConfiguration.AddBasicAuthentication((userName, password) => accountService.Authenticate(userName, password), (username) => accountService.GetRoles(username));