OWIN WebAPI 2承载身份验证自定义标识

本文关键字:身份验证 自定义 标识 WebAPI OWIN | 更新日期: 2023-09-27 18:05:11

我想在我的网站上允许两种类型的身份验证:*表单认证:用户使用表单中的详细信息登录。应该使用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
}

在全球。asax,我已经重写了Application_OnPostAuthenticateRequest方法,以便设置自定义身份,它确实工作得很好- ,但仅在表单中,而不是在WebAPI

另外,我在WebApiConfig.cs

        config.SuppressDefaultHostAuthentication();

所以MyIdentity为空和User为空是有意义的。身份重置回ClaimsIdentity。

所以总结我的问题-有一种方法来定义哪个身份类将被使用,所以我可以设置MyIdentity而不是ClaimsIdentity?

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