簡體   English   中英

OWIN WebAPI 2承載認證自定義標識

[英]OWIN WebAPI 2 Bearer authentication custom identity

我想在我的網站上允許兩種類型的身份驗證:*表單身份驗證:用戶使用表單中的詳細信息登錄。 應使用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?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM