- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不知道我遗漏了哪里,如果用户名和密码错误,我将无法发送错误消息。我的服务运行良好,如果用户 ID 和密码与 200 状态不匹配并且手动创建的状态成功,我可以手动发送错误消息。这是我的代码,我创建了 HandleRequest
类
public class HandleRequest : Attribute, IAuthenticationFilter
{
public string Realm { get; set; }
public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
//throw new NotImplementedException();
HttpRequestMessage request = context.Request;
AuthenticationHeaderValue authorization = request.Headers.Authorization;
string status = await SendAsync(request, cancellationToken);
if (context.Request.RequestUri.LocalPath == "/Login/UserLogin")
{
return;
}
else if (authorization == null)
{
// No authentication was attempted (for this authentication method).
// Do not set either Principal (which would indicate success) or ErrorResult (indicating an error).
context.ErrorResult = new AuthenticationFailureResult("Null auth token..", request);
return;
}
else if (status == "Success")
{
return;
}
else
{
context.ErrorResult = new AuthenticationFailureResult("Invalid auth token..", request);
return;
}
}
public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
{
Challenge(context);
return Task.FromResult(0);
}
private void Challenge(HttpAuthenticationChallengeContext context)
{
string parameter;
if (String.IsNullOrEmpty(Realm))
{
parameter = null;
}
else
{
// A correct implementation should verify that Realm does not contain a quote character unless properly
// escaped (precededed by a backslash that is not itself escaped).
parameter = "realm=\"" + Realm + "\"";
}
context.ChallengeWith("Basic", parameter);
}
public virtual bool AllowMultiple
{
get { return false; }
}
private static bool TryRetrieveToken(HttpRequestMessage request, out string token)
{
token = null;
IEnumerable<string> authzHeaders;
if (!request.Headers.TryGetValues("Authorization", out authzHeaders) || authzHeaders.Count() > 1)
{
return false;
}
var bearerToken = authzHeaders.ElementAt(0);
token = bearerToken.StartsWith("Bearer ") ? bearerToken.Substring(7) : bearerToken;
return true;
}
public async Task<string> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
string status = "";
HttpStatusCode statusCode;
string token;
//determine whether a jwt exists or not
if (!TryRetrieveToken(request, out token))
{
statusCode = HttpStatusCode.Unauthorized;
//allow requests with no token - whether a action method needs an authentication can be set with the claimsauthorization attribute
//return base.SendAsync(request, cancellationToken);
}
try
{
string sec = WebConfigurationManager.AppSettings["sec"];
var now = DateTime.UtcNow;
var securityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(sec));
SecurityToken securityToken;
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
TokenValidationParameters validationParameters = new TokenValidationParameters()
{
ValidAudience = "http://localhost:1987",
ValidIssuer = "http://localhost:1987",
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
LifetimeValidator = this.LifetimeValidator,
IssuerSigningKey = securityKey
};
//extract and assign the user of the jwt
Thread.CurrentPrincipal = handler.ValidateToken(token, validationParameters, out securityToken);
HttpContext.Current.User = handler.ValidateToken(token, validationParameters, out securityToken);
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
var id = int.Parse(identity.Claims.Where(c => c.Type == "id")
.Select(c => c.Value).SingleOrDefault());
bool isValidToken = IsValidToken(id, userName, type);
if (isValidToken == true)
{
status = "Success";
}
else
{
statusCode = HttpStatusCode.Unauthorized;
status = "Unauthorized";
}
}
catch (SecurityTokenValidationException e)
{
e.Message.ToString();
statusCode = HttpStatusCode.Unauthorized;
status = "Unauthorized";
}
catch (Exception ex)
{
ex.Message.ToString();
statusCode = HttpStatusCode.InternalServerError;
status = "InternalServerError";
}
return status;
}
public bool LifetimeValidator(DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters)
{
if (expires != null)
{
if (DateTime.UtcNow < expires) return true;
}
return false;
}
private bool IsValidToken(int? id, string userName, string type)
{
bool isValid = false;
using (MCSDEMOEntities con = new MCSDEMOEntities())
{
var GetUserDatails = (from u in con.ios_Users
where u.ID == id && u.LOGIN == userName && u.TYPEDESCR == type
select u).ToList();
if (GetUserDatails.Count == 1)
{
isValid = true;
}
else
{
isValid = false;
}
}
return isValid;
}
}
public static class HttpRequestHeadersExtensions
{
public static void Set(this HttpRequestHeaders headers, string name, string value)
{
if (headers.Contains(name)) headers.Remove(name);
headers.Add(name, value);
}
}
public static class HttpAuthenticationChallengeContextExtensions
{
public static void ChallengeWith(this HttpAuthenticationChallengeContext context, string scheme)
{
ChallengeWith(context, new AuthenticationHeaderValue(scheme));
}
public static void ChallengeWith(this HttpAuthenticationChallengeContext context, string scheme, string parameter)
{
ChallengeWith(context, new AuthenticationHeaderValue(scheme, parameter));
}
public static void ChallengeWith(this HttpAuthenticationChallengeContext context, AuthenticationHeaderValue challenge)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
context.Result = new AddChallengeOnUnauthorizedResult(challenge, context.Result);
}
}
public class AddChallengeOnUnauthorizedResult : IHttpActionResult
{
public AuthenticationHeaderValue Challenge { get; private set; }
public IHttpActionResult InnerHttpResult { get; private set; }
public AddChallengeOnUnauthorizedResult(AuthenticationHeaderValue challenge, IHttpActionResult innerResult)
{
Challenge = challenge;
InnerHttpResult = innerResult;
}
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response = await InnerHttpResult.ExecuteAsync(cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
// Only add one challenge per authentication scheme.
if (!response.Headers.WwwAuthenticate.Any((h) => h.Scheme == Challenge.Scheme))
{
response.Headers.WwwAuthenticate.Add(Challenge);
}
}
return response;
}
}
public class AuthenticationFailureResult : IHttpActionResult
{
public string ReasonPhrase { get; private set; }
public HttpRequestMessage Request { get; private set; }
public AuthenticationFailureResult(string reasonPhrase, HttpRequestMessage request)
{
ReasonPhrase = reasonPhrase;
Request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.FromResult(execute());
}
private HttpResponseMessage execute()
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
response.RequestMessage = Request;
response.ReasonPhrase = ReasonPhrase;
return response;
}
}
我的 webapi 配置文件
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
//check each request
config.Filters.Add(new HandleRequest());
// configuration for json reponse
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
//LoginController
// Login Model
config.Routes.MapHttpRoute(
name: "LoginApi",
routeTemplate: "{controller}/{action}",
defaults: new { controller = "Login", action = "UserLogin", id = RouteParameter.Optional }
);
}
和我的登录 Controller
public class LoginController : ApiController
{
LoginModel logMod = new LoginModel();
LoginResponse logResp = new LoginResponse();
[HttpPost]
public LoginResponse UserLogin(LoginRequest logReq)
{
logResp = logMod.UserLogin(logReq );
return logResp;
}
}
登录模型类
public LoginResponse UserLogin(LoginRequest LogReq)
{
LoginResponse logResp = new LoginResponse();
try
{
if (LogReq.userName != "" && LogReq.password != "")
{
using (MCSDEMOEntities DataModel = new MCSDEMOEntities())
{
var UserDetails = (from user in DataModel.ios_Users
where (user.LOGIN == LogReq.userName && user.PASSWORD == LogReq.password && user.ACTIVE != 0)
select new
{
user.ID,
user.TYPEDESCR,
user.USERNAME
}).ToList();
if (UserDetails.Count != 0)
{
foreach (var Udetails in UserDetails)
{
logResp.id = Udetails.ID;
logResp.type = Udetails.TYPEDESCR;
logResp.userName = Udetails.USERNAME;
}
//create jwt token.
logResp.userToken = createToken(logResp.id, logResp.type, LogReq.userName);
logResp.Status = "Success";
}
else
{
logResp.Status = "401";
//throw new HttpResponseException("Customer Name cannot be empty", HttpStatusCode.BadRequest);
// throw new AuthenticationFailureResult("","")
}
}
}
else
{
logResp.Status = "No Condition Match";
}
}
catch (Exception ex)
{
logResp.Status = ex.Message.ToString();
}
return logResp;
}
在上面的代码中,它很好地执行了服务,但即使用户 ID 和密码不匹配,它也会发送 http-200 ok 消息和我的状态 - json 中的 401。我想通过代码 401 传递 http
最佳答案
您需要从您的 api 返回 HttpResponseMessage
以便您可以使用其他信息(如状态)包装您的响应对象
[HttpPost]
public HttpResponseMessage UserLogin(LoginRequest logReq)
{
logResp = logMod.UserLogin(logReq );
// Decide based on your logic. This is
// a mock example.
var status = HttpStatusCode.OK
return Request.CreateResponse(HttpStatusCode.OK, logResp);
}
您可以在此处找到更多信息:https://learn.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results
引用自:
HttpResponseMessage Convert directly to an HTTP response
Other type Write the serialized return value into the response body; return 200 (OK).
关于c# - 如何在 web api 中使用过滤器传递带有错误消息的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59243234/
我有一个对象数组,我想在键传入“filter”过滤器时提取值。下面是我尝试过的 Controller 代码片段,但我得到的响应类型未定义。请帮我找出哪里出错了。 var states = [{"HI
如果任何 J2EE 应用程序直接访问 servlet,然后 servlet 将相同的请求转发到某个 .jsp 页面。 request.getRequestDispatcher("Login.jsp")
我有一个带有图像缩略图的表单,可以通过复选框进行选择以进行下载。我想要一个包含 jQuery 中图像的数组,用于 Ajax 调用。 2个问题: - 表格顶部有一个复选框,用于切换我想要从映射中排除的所
我必须从服务器转储数据库,将 .sql 传输到另一台服务器,然后运行以下脚本以使用此语法删除某些行: DELETE wp_posts FROM wp_posts INNER JOIN wp_postm
我想从目录中过滤掉特定类型的文件,但收到错误“ token 语法错误,删除这些 token ”: File dir = new File("c:/etc/etc"); File[] f
几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。 您应该始终对外部数据进行过滤! 输
我正在开发一个由 OData 服务提供支持的搜索功能。它将返回一个或一列标题对象作为结果。我们需要搜索的许多字段不在标题对象中。它们仅在子对象(导航属性)中。能够针对子字段执行 OData 搜索并仍然
假设我有以下模型,它有一个方法 variants(): class Example(models.Model): text = models.CharField(max_length=255)
我有一个默认的列表列表,但我基本上想这样做: myDefaultDict = filter(lambda k: len(k)>1, myDefaultDict) 除了它似乎只适用于列表。我能做什么?
我正在使用 django-filter 来输出我的模型的过滤结果。那里没有问题。下一步是添加一个分页器……尽管现在已经苦苦挣扎了好几天。 views.py: def funds_overview(re
我正在做一个概念证明,我正在试验一种奇怪的行为。 我有一个按日期字段按范围分区的表,如果我设置固定日期或由 SYSDATE 创建的日期,查询的成本会发生很大变化。 这些是解释计划: SQL> SELE
如果一个或另一个值匹配,是否可以制作一个过滤器,例如一个中性的 PropertyFilter(并传递给链中的下一个过滤器)?就像是: value1 val
我是 VBA 初学者,正在尝试根据单元格值过滤数据,经过一番谷歌搜索后,我编写了一个有效的代码 Sub FilterDepartment_Sales() Sheet6.Activate
假设我在 excel 数据透视表中有两个过滤器。 两者最初都会显示筛选列的选定范围内的所有值。 当我仅在过滤器 1 中选择几个值时,过滤器 2 仍会继续显示基础数据中所选范围内特定过滤器列中的所有值。
是否可以定义自定义 build-ins (名称不再适合)在 ftl? 由于语义前提,我不想让它成为一个函数,而是一个内置的。 最佳答案 这是不可能的,?语法是为内置函数保留的。 (顺便说一句,这意味着
我试图在 Edit | 之外添加一个链接通过插件删除wordpress管理员>用户>所有用户列表中的链接..这是我第一次尝试通过查看其他插件或搜索google来制作wordpress插件.. 我添加了
我正在尝试按照以下教程使用 django 过滤器进行分页,但该教程似乎缺少某些内容,而且我无法使用基于函数的 View 方法显示分页。 https://simpleisbetterthancomple
由于我是 Powershell 新手,因此寻求最佳实践方面的帮助, 我有一个 csv 文件,我想过滤掉 csv 中的每一行,除了包含“未安装”的行 然后,我想根据包含计算机列表的单独 csv 文件过滤
我正在尝试创建一个搜索查询,它会告诉我我作为审阅者添加到其中的打开更改,但我还没有提交最新补丁集的代码审查。这应该包括其他人已经评论过的更改,但我没有。 我能找到的最接近的是 is:reviewer
在我的 Web 应用程序中,我有 3 个主要部分 1. 客户 2. 供应商 3. 管理员 我正在使用 java session 过滤器来检查用户 session 并允许访问网站的特定部分。 因此客户只
我是一名优秀的程序员,十分优秀!