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