我想在我的网站上允许两种类型的身份验证: *表单身份验证:用户使用表单中的详细信息登录。应使用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?
答案 0 :(得分:2)
对于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());
...