我想在我的网站上允许两种类型的身份验证:*表单身份验证:用户使用表单中的详细信息登录 . 应使用cookie进行身份验证 . *承载:当调用WebAPI(用于移动设备)时,应使用承载令牌进行身份验证 only .
我已经转发了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?
1 回答
对于Web API,您可以尝试连接到OWIN身份验证管道,并实现自己的身份验证筛选器,并使用它将当前主体更改为您自己的:
并注册过滤器: