如何在Web Api中创建基本身份验证?

时间:2019-03-27 08:34:37

标签: c# visual-studio

我具有以下.cs以便在我的api中创建一些基本身份验证。效果很好,但第一次运行时只出现一次。如何使它再次出现(每次运行)?

namespace CMob
{
    public class BasicAuthenticationAttribute : AuthorizationFilterAttribute
    {

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var authHeader = actionContext.Request.Headers.Authorization;

        if (authHeader != null)
        {
            var authenticationToken = actionContext.Request.Headers.Authorization.Parameter;
            var decodedAuthenticationToken = Encoding.UTF8.GetString(Convert.FromBase64String(authenticationToken));
            var usernamePasswordArray = decodedAuthenticationToken.Split(':');
            var userName = usernamePasswordArray[0];
            var password = usernamePasswordArray[1];


            var isValid = userName == "chrysa" && password == "1234";

            if (isValid)
            {
                var principal = new GenericPrincipal(new GenericIdentity(userName), null);
                Thread.CurrentPrincipal = principal;

                return;
            }
        }

        HandleUnathorized(actionContext);
    }

    private static void HandleUnathorized(HttpActionContext actionContext)
    {
        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
        actionContext.Response.Headers.Add("WWW-Authenticate", "Basic Scheme='Data' location = 'http://localhost:");
    }
}
}¨

我的控制器

 public class DController : ApiController
    {
        [BasicAuthentication]
        [Route("api/D")]
        public IEnumerable<D> Get()
        {
            using (CM_DataEntities entities = new CM_DataEntities())
            {
                return entities.Ds.ToList();
            }
        }
}

谢谢!

3 个答案:

答案 0 :(得分:0)

“对于未经身份验证的请求,服务器应返回响应,其头部包含HTTP 401未经授权状态[4]和WWW身份验证字段。[5]”

您应该参考https://en.wikipedia.org/wiki/Basic_access_authentication。 我很确定您可以在那找到所需的答案。

基本上,浏览器提供身份验证,您绝对无法控制它。

答案 1 :(得分:0)

您必须在WebApiConfig.cs中声明属性:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

并且您必须装饰控制器和/或操作:

config.Filters.Add(new BasicAuthenticationAttribute());

答案 2 :(得分:0)

这实际上取决于您要定义的行为。 如果您希望对整个API使用身份验证过滤器,则可以通过以下方式将其添加到全局过滤器列表中(在WebApiConfig.cs中):

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new BasicAuthenticationAttribute());
}

如果您希望限制控制器的所有方法,请使用以下方式进行装饰:

[BasicAuthentication]
public class RestrictedController : ApiController
{
   //Your controller definition
}

当然,您可以通过以下方式在单个方法上使用它:

[BasicAuthentication]
public JsonResult GetJsonDataAsAuthenticatedUser()
{
    //your method definition
}

您可以指定一种方法,无需使用AllowAnonymous装饰进行身份验证:

[BasicAuthentication]
public class RestrictedController : ApiController
{
   [AllowAnonymous]
   public IActionResult Authenticate()
   {
      //Your authentication entry point
   }       
}

您可以参考this link