如何在我的网络API上将身份验证类型更改为电话号码而不是用户名?

时间:2018-06-01 11:57:27

标签: authentication asp.net-web-api asp.net-identity asp.net-authentication

我的身份验证工作正常,但我需要使用phoneNumber用户而不是用户名。 有我的提供者类

using Identity.Infrastructure;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.OAuth;
using System.Security.Claims;
using System.Threading.Tasks;

namespace Identity.Providers
{
public class CustomOAuthProvider : OAuthAuthorizationServerProvider
{

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
        return Task.FromResult<object>(null);
    }

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {

        var allowedOrigin = "*";

        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });

        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        if (!user.EmailConfirmed)
        {
            context.SetError("invalid_grant", "User did not confirm email.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, "JWT");

        var ticket = new AuthenticationTicket(oAuthIdentity, null);

        context.Validated(ticket);
    }
  }
}

在这个类上下文中只有userName和Password,所以即使我把它作为参数发送它也无法到达PhoneNumber。我想如果我能改变就会解决问题

userManager.FindAsync(context.UserName, context.Password)
像这样

userManager.FindAsync(context.PhoneNumber, context.Password)

VS不允许我干涉 OAuthGrantResourceOwnerCredentialsContext

 using Identity.Infrastructure;
 using Microsoft.AspNet.Identity.EntityFramework;
 using System;
 using System.Collections.Generic;
 using System.Net.Http;
 using System.Web.Http.Routing;

 namespace Identity.Models
 {
     public class ModelFactory
     {
         private UrlHelper _UrlHelper;
         private ApplicationUserManager _AppUserManager;

         public ModelFactory(HttpRequestMessage request, ApplicationUserManager appUserManager)
         {
             _UrlHelper = new UrlHelper(request);
             _AppUserManager = appUserManager;
         }

         public UserReturnModel Create(ApplicationUser appUser)
         {
             return new UserReturnModel
             {
                 Url = _UrlHelper.Link("GetUserById", new { id = appUser.Id }),
                 Id = appUser.Id,
                 UserName = appUser.UserName,
                 FullName = string.Format("{0} {1}", appUser.FirstName, appUser.LastName),
                 Email = appUser.Email,
                 EmailConfirmed = true,
                 Level = appUser.Level,
                 JoinDate = appUser.JoinDate,
                 Roles = _AppUserManager.GetRolesAsync(appUser.Id).Result,
                 Claims = _AppUserManager.GetClaimsAsync(appUser.Id).Result,
                 PhoneNumber = appUser.PhoneNumber
             };


         }

         public RoleReturnModel Create(IdentityRole appRole)
         {

             return new RoleReturnModel
             {
                 Url = _UrlHelper.Link("GetRoleById", new { id = appRole.Id }),
                 Id = appRole.Id,
                 Name = appRole.Name
             };
         }
     }

     public class RoleReturnModel
     {
         public string Url { get; set; }
         public string Id { get; set; }
         public string Name { get; set; }
     }
     public class UserReturnModel
     {
         public string Url { get; set; }
         public string Id { get; set; }
         public string UserName { get; set; }
         public string FullName { get; set; }
         public string PhoneNumber { get; set; }
         public string Email { get; set; }
         public bool EmailConfirmed { get; set; }
         public int Level { get; set; }
         public DateTime JoinDate { get; set; }
         public IList<string> Roles { get; set; }
         public IList<System.Security.Claims.Claim> Claims { get; set; }
     }
 }

结果我坚持用phoneNumber而不是userName进行身份验证,并将deviceId设置为密码

1 个答案:

答案 0 :(得分:0)

public override Task<ApplicationUser> FindAsync(string Phone, string password)

    {
        //Do your  Stuff here
        //return base.FindAsync(userName, password);
    }

Overrride FIndAsync() in the IndentityConfig.cs