我对 .net 相当陌生,我正在尝试创建一个 restfull 服务,您可以在其中通过 OAuth2 对 facebook 等服务进行身份验证,也可以使用“普通帐户”登录。VS2013 的 SPA 模板让我可以快速轻松地完成此操作,我对此非常满意。
现在我面临一个不同的问题。我似乎无法找到一种方法来分离对这些不同类型的登录的访问。例如,我想只允许来自 oauth 身份验证方法的用户访问 X,而以“正常方式”(也使用不记名令牌)进行身份验证的用户只能看到 Y。
我在网上搜索,似乎我应该使用 [Authorize] 标签,但我不确定如何自定义它,也不确定如何区分不同的登录名。我发现了不同的自定义标签的方法,但似乎都没有奏效,而且我不断地遇到过时的解决方案。
任何人都可以帮忙吗?
谢谢!
我的最终解决方案(感谢 0leg)
为每种身份验证类型创建了一个授权标签:
public class AuthorizeExternalsOnly : AuthorizeAttribute
{
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{
string externalClaim = "";
try
{
externalClaim = (actionContext.ControllerContext.RequestContext.Principal.Identity as ClaimsIdentity).Claims.FirstOrDefault(x => x.Type == ClaimTypes.Authentication).Value;
}
catch (NullReferenceException)
{
Debug.WriteLine("no external claim found");
}
if (externalClaim != "")
{
return base.IsAuthorized(actionContext);
}
return false;
}
return false;
}
}
然后,在帐户控制员处,我在GetExternalLogin处添加了声明
oAuthIdentity.AddClaim(new Claim(ClaimTypes.Authentication, "External"));
(...)
identity.AddClaim(new Claim(ClaimTypes.Authentication, "External"));
在每次登录之前。