【发布时间】:2014-06-05 16:41:08
【问题描述】:
我对 .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"));
就在每次登录之前。
【问题讨论】:
-
当你说 access 时,你的意思是 authorization 吗? Asp.net Identity 带有 IdentityRole 和其他实现。您可以通过 Roles 将第三方登录与本地登录分开。
-
是的。在有问题的项目中,某些路由应该只能由一个登录名访问,而其他路由只能由另一个登录名访问。我的问题是两种情况下的用户本质上是相同的(唯一不同的是他们验证和获取访问令牌的方式)。
-
该解决方案将起作用。尽管为了减少代码量,您可以将这两个属性合并为一个,并将一个参数传递给它,指示您想要哪种类型的授权。例如。
[CustomAuthorizeAttribute("External")]
标签: .net restful-authentication owin asp.net-web-api2 authorize