2014-08-29 39 views
1

我在新发布的书ASP.NET Web Api 2 Recipes中使用食谱10-3来支持Web API中的基本身份验证。这个食谱使用Thinktecture的第三方库。从下面的代码可以看出,我使用用户身份验证自己的帐户服务。ASP.NET Web API中基于角色的授权 - 如何在主体上设置角色?

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(Roles="administrator")] 
public IHttpActionResult Get() 
{ 
    ... 
} 

我的帐户服务显然知道有关用户及其分配的角色,但这些信息是不可用授权attibute(角色未在委托人身上设置)。

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

回答

2

我发现AddBasicAutentication方法实际上有一个需要委托来提供角色的重载。这正是我所期待的。所以现在呼叫AddBasicAuthentication看起来像这样,并且一切都像一个魅力:

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

大声笑。完全忘记了这一点。尽管如此,OWIN方法更受推荐。 – leastprivilege 2014-08-31 09:30:20

+0

它可以帮助很大,但在我的Thinktecture中,AddBasicAuthentication()没有重载(版本3.6.1.0)。你是什​​么? – 2015-03-27 08:32:03

+0

我的ThinkTecture AuthenticationHanlder版本来自NuGet软件包版本1.1.0 ... – 2015-03-27 09:26:22

3

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

如果你的Web API第2版 - 我宁愿建议切换到基本身份验证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。

+0

如何在一个单独的步骤中设置角色?在我的版本(最新)没有允许分配角色委托'AddBasicAuthentication((userName,password)=> accountService.Authenticate(userName,password),(username)=> accountService.GetRoles(username));' – 2015-03-27 10:52:26