【问题标题】:OWIN WebAPI 2 Bearer authentication custom identityOWIN WebAPI 2 承载认证自定义身份
【发布时间】:2014-07-13 20:50:48
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多