1


我正在尝试在我的 Web APi 2 项目中自定义访问令牌 json 对象。我已经成功地做到了。但我无法弄清楚请求失败的情况。

这是我的自定义回复:-
{ data: {}, success: 0, message: "failed" }

以下是GrantResourceOwnerCredentials继承的ApplicationOAuthProvider方法OAuthAuthorizationServerProvider

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
    ApplicationUserManager userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
    ApplicationUser user = userManager.Find(context.UserName, context.Password);
    bool reqFailed = false;
    string reqFailedMsg = "";

    if (user == null)
    {
        reqFailed = true;
        reqFailedMsg = "The user name or password is incorrect.";
    }

    if (!reqFailed && !user.EmailConfirmed)
    {
        reqFailed = true;
        reqFailedMsg = "The user email is not confirmed.";
        //context.SetError("invalid_grant", "The user email is not confirmed.");
        //return;
    }

    if (!reqFailed && !user.IsActive)
    {
        reqFailed = true;
        reqFailedMsg = "The user is disabled.";
        //context.SetError("invalid_grant", "The user is disabled.");
        //return;
    }

    if (reqFailed)
    {
        try
        {
            context.Response.Headers.Add(LMS.Utilities.Constants.MyMiddlewareHeader, new[] { (400).ToString() });
            context.Response.Headers.Add(LMS.Utilities.Constants.MyMiddlewareHeaderMsg, new[] { reqFailedMsg });
        }
        catch (Exception ex)
        {
        } 
        return;
    }

    var form = await context.Request.ReadFormAsync();

    if (form["deviceType"] != null && form["deviceToken"] != null)
    {
        user.DeviceToken = form["deviceToken"];
        user.DeviceType = form["deviceType"];

        userManager.Update(user);
    }

    ClaimsIdentity oAuthIdentity = userManager.GenerateUserIdentity(userManager, user,
        OAuthDefaults.AuthenticationType);
    ClaimsIdentity cookiesIdentity = userManager.GenerateUserIdentity(userManager, user,
        CookieAuthenticationDefaults.AuthenticationType);

    AuthenticationProperties properties = CreateProperties(user.UserName);
    AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
    context.Validated(ticket);
    //context.Request.Context.Authentication.SignIn(cookiesIdentity);
    context.Request.Context.Authentication.SignIn(properties, cookiesIdentity);
    //return Task.FromResult<object>(null);
    }


和中间件类:-

public class AuthenticationMiddleware : OwinMiddleware
{
    public AuthenticationMiddleware(OwinMiddleware next) : base(next) { 

    }

    public override async Task Invoke(IOwinContext context)
    {
        await Next.Invoke(context);
        if (context.Response.Headers.ContainsKey(Constants.MyMiddlewareHeader))
        {
            using (var reader = new StreamReader(context.Request.Body))
            {
                var headerValues = context.Response.Headers.GetValues(Constants.MyMiddlewareHeader);
                context.Response.StatusCode = Convert.ToInt16(headerValues.FirstOrDefault());
                context.Response.Headers.Remove(Constants.MyMiddlewareHeader);

                var headerValuesMessage = context.Response.Headers.GetValues(Constants.MyMiddlewareHeaderMsg);
                string msg = headerValuesMessage.FirstOrDefault().ToString();
                context.Response.Headers.Remove(Constants.MyMiddlewareHeaderMsg);

                string resp = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseViewModel<object>(new { }, (int)ResponseStatus.Fail, msg));

                var response = context.Response;
                var body = await reader.ReadToEndAsync();
                var bytes = Encoding.UTF8.GetBytes(resp);

                response.ContentLength = bytes.Length;
                await response.WriteAsync(bytes);

                return;
            }
        }
    }
}

我得到的是: -

{"error":"invalid_grant"}{"Data":{},"Status":0,"Message":"The user name or

如您所见,这是无效的 json。

任何帮助,将不胜感激。谢谢!

4

0 回答 0