OWIN Web API 2承载认证自定义标识

时间:2014-05-24 16:07:11

标签: c# asp.net-mvc-4 asp.net-web-api owin

我想在我的网站上允许两种类型的身份验证:  *表单身份验证:用户使用表单中的详细信息登录。应使用cookie进行身份验证。  *持有人:在致电WebAPI(移动设备)时,应通过使用承载令牌进行身份验证

我已经转发了SPA模板以及SO中的一些问题并且成功地将其提供给了。 我面临的唯一问题是ClaimsIdentity:我希望使用自定义标识类。但是,我只能在表单身份验证中执行此操作,而不能在承载WebAPI请求中执行此操作。

我的自定义身份:

public class MyIdentity : ClaimsIdentity, IMyIdentity
{
    #region IMyIdentity

    private Account _account = null;

    public Account Account
    {
        get
        {
            if (_account == null)
            {
                if (this.IsAuthenticated)
                {
                    Guid claimedAccountId = Guid.Parse(this.FindFirst(ClaimTypes.NameIdentifier).Value);

                    var accountService = ServiceLocator.SharedInstance.GetInstance<IAccountService>();

                    _account = accountService.Where(
                        a => a.Id == claimedAccountId
                        ).FirstOrDefault();
                }

                _account = _account ?? Membership.Account.GuestAccount;
            }

            return _account;
        }
    }

    #endregion
}

在Global.asax中,我已覆盖Application_OnPostAuthenticateRequest方法以设置自定义标识,并且它确实运行良好 - 但仅限于表单,而不是WebAPI

另外,我确实设置了WebApiConfig.cs

        config.SuppressDefaultHostAuthentication();

因此,MyIdentity被取消并且User.Identity重置为ClaimsIdentity确实有意义。

总结一下我的问题 - 有没有办法定义将使用哪个Identity类,所以我可以设置MyIdentity而不是ClaimsIdentity?

1 个答案:

答案 0 :(得分:2)

对于Web API,您可以尝试连接到OWIN身份验证管道,并实现自己的身份验证筛选器,并使用它将当前主体更改为您自己的身份:

public class MyAuthenticationFilter : ActionFilterAttribute, IAuthenticationFilter
 {

        public Task AuthenticateAsync(HttpAuthenticationContext context, System.Threading.CancellationToken cancellationToken)
        {
                 if (context.Principal != null && context.Principal.Identity.IsAuthenticated)
                 {
                       CustomPrincipal myPrincipal = new CustomPrincipal();

                       // Do work to setup custom principal

                       context.Principal = myPrincipal;
                 }

               return Task.FromResult(0);
 }

注册过滤器:

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

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