具有OAuth和基本身份验证的C#Web Api

时间:2018-03-23 14:43:23

标签: c# authentication asp.net-web-api oauth basic-authentication

我有一个配置了OAuth的Asp.net web api。现在我有新的客户端不能使用Oauth但想要使用相同端点URL的基本身份验证。

还没有找到任何方法来做到这一点。对此有任何帮助表示赞赏。在此先感谢

1 个答案:

答案 0 :(得分:1)

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if ((Thread.CurrentPrincipal.Identity.Name?.Length ?? 0) <= 0)
        {
            AuthenticationHeaderValue auth = actionContext.Request.Headers.Authorization;
            if (string.Compare(auth.Scheme, "Basic", StringComparison.OrdinalIgnoreCase) == 0)
            {
                string credentials = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(auth.Parameter));
                int separatorIndex = credentials.IndexOf(':');
                if (separatorIndex >= 0)
                {
                    string userName = credentials.Substring(0, separatorIndex);
                    string password = credentials.Substring(separatorIndex + 1);
                    var userManager = new MembershipUserManager();
                    var user = userManager.FindAsync(userName, password).Result;
                    if (user != null)
                        Thread.CurrentPrincipal = actionContext.ControllerContext.RequestContext.Principal = new GenericPrincipal(new GenericIdentity(userName, "Basic"), System.Web.Security.Roles.Provider.GetRolesForUser(userName));
                }
            }
        }
        return base.IsAuthorized(actionContext);
    }
}

一旦设置了令牌auth(Oauth),就可以使用此代码,这对两种方法都适用:此属性应在所有地方使用(放弃Authorize)[包含角色],并验证基本auth,而验证基本auth。 IsAuthorized(actionContext);将验证令牌方法(Oauth)。

MembershipUserManager是我创建的自定义类,以使其与Membership一起使用,我猜您将使用Identity User Manager。