Web API中的自定义授权 - 来自ASP.Net Web API用户的IClaimsPrincipal(System.Security.Claims.ClaimsPrincipal)

时间:2015-01-26 22:08:41

标签: c# asp.net asp.net-identity wif

我有一个Web API,我需要自定义授权。我正在使用oAuth令牌,我想我可以通过实施authorizationManager来进行额外的检查

using Microsoft.IdentityModel.Claims;
using System.Diagnostics;
using System.Linq;

public override bool CheckAccess(AuthorizationContext context){
    public override bool CheckAccess(AuthorizationContext context)
    {
        //authorization code here
    }
}

当我尝试创建AuthorizationContext但没有正确的主体类型时,会出现问题。我注意到,在我的Web API调用中,我得到的是一个System.Security.Claims.ClaimsPrincipal的用户,该用户无法转换为新的AuthorizationContext所需的IClaimsPrincipal。

var authorizationContext = new AuthorizationContext(principal, "resource", "action");//System.Security.Claims.ClaimsPrincipal is the wrong type of principal here, but is what user is on Web API call.

这当然会导致以下错误:

无法从'System.Security.Claims.ClaimsPrincipal'转换为'Microsoft.IdentityModel.Claims.IClaimsPrincipal'

我应该实现除ClaimsAuthorizationManager以外的其他东西吗?给定我的主体类型,是否有一种简单的方法来创建我需要的上下文对象?

我确实注意到ClaimsAuthorizationManager在Microsoft.IdentityModel.Claims中,而其他很多web api的东西都在Microsoft.AspNet.Identity或Microsoft.AspNet.Identity.Core中,这或许是一个线索,它可能不是正确的要使用的东西。

1 个答案:

答案 0 :(得分:0)

事实上,我正走向错误的道路,如线索所示。我最终实现了类似于此的System.Web.Http.AuthorizeAttribute:

using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;

public class AuthAttribute : System.Web.Http.AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        //authorization stuff here
    }
}

然后在我的WebApiConfig.cs中添加了Register方法:

config.Filters.Add(new AuthAttribute());