我具有以下.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();
}
}
}
谢谢!
答案 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