首页 文章

OWIN WebAPI 2承载认证自定义标识

提问于
浏览
0

我想在我的网站上允许两种类型的身份验证:*表单身份验证:用户使用表单中的详细信息登录 . 应使用cookie进行身份验证 . *承载:当调用WebAPI(用于移动设备)时,应使用承载令牌进行身份验证 only .

我已经转发了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 回答

  • 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());
                ...
    

相关问题