[英]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.