【问题标题】:How do you setup mixed authorizations for different authentications in .net (web api 2 + owin)如何在 .net 中为不同的身份验证设置混合授权(web api 2 + owin)
【发布时间】: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


【解决方案1】:

您可以创建声明来定义您的用户类型(内部、facebook 等)。然后创建一个自定义 Authorize 属性来做出授权决定。

查看thisthisthis 链接了解一些背景信息。

自定义 Authorize 属性的代码示例。 HttpActionContext 参数可让您查看您调用的控制器和操作。它还允许您检查用户的 Claims 集合。单步执行不同登录场景的代码,您将有不同的声明。然后您可以决定您的 Controller.Action 是否被授权用于特定的声明值。

protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
{
    ActionName = actionContext.ActionDescriptor.ActionName,
    ControllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName,
    Claims = (actionContext.RequestContext.Principal.Identity as ClaimsIdentity).Claims.ToList()
}

【讨论】:

  • 嗨,0leg,谢谢你的帮助,但我仍然遇到同样的问题......目前我已经从 AuthorizeAttribute 类中覆盖了函数“IsAuthorized”,而不是函数“Authorize”。这是正确的方法吗?从这里开始,我不知道如何验证正在使用哪种方法进行身份验证。我真的一无所知,关于这个话题的信息似乎太少了......
  • 是的,你是对的,我添加了一个代码示例,展示了如何覆盖 IsAuthorized。
  • 非常感谢!我刚刚将我的解决方案添加到原始帖子中。可能不是很优化,但现在可以完成这项工作。
猜你喜欢
  • 1970-01-01
  • 2014-07-01
  • 2014-01-28
  • 2014-08-24
  • 2015-07-18
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多