1

我正在使用新出版的书ASP.NET Web Api 2 Recipes中的配方 10-3来支持我的 Web API 中的基本身份验证。此配方使用 Thinktecture 的 3rd 方库。从下面的代码中可以看出,我正在根据我自己的帐户服务对用户进行身份验证。

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()
{
    ...
}

我的帐户服务显然知道用户及其分配的角色,但 Authorize 属性无法使用此信息(角色未在主体上设置)。

我该如何做到这一点?可以将 Thinktecture 身份验证处理程序配置为在主体上设置角色吗?或者我应该制作自己的自定义 Authorize 属性(从 Authorize 属性派生)?如果是这样,我是否应该覆盖 OnAuthorization 方法以使用我的帐户服务创建和设置主体?或者可能直接覆盖 IsAuthorized 方法?或者可能是别的什么...

4

2 回答 2

3

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

如果您使用的是 Web API v2 - 我宁愿建议切换到基本的身份验证 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

还有一个nuget。

于 2014-08-30T09:09:20.627 回答
2

我发现 AddBasicAutentication 方法实际上有一个重载,它需要一个委托来提供角色。这正是我一直在寻找的。所以现在对 AddBasicAuthentication 的调用看起来像这样,一切都像一个魅力:

authenticationConfiguration.AddBasicAuthentication((userName, password) => accountService.Authenticate(userName, password), (username) => accountService.GetRoles(username));
于 2014-08-30T22:27:31.097 回答