.NET CORE IDENITY SIGNINITY SIGNMANAGER在控制台应用中w/o di/web主机



我正在尝试编写一个通用.NET CORE 2.2控制台应用程序,该应用程序允许我使用身份。具体来说,我有一个数据库,只是在呼叫signinmanager.passwordsignInasync((以对我的db进行用户名/密码。

如果我以完整的.netcore webapp运行此操作,则httpcontext和di都构建了,它可以正常工作。如果我将其剥离并简单地调用基本服务,我每次都会遇到相同的错误。

我已经尝试了几天了,根本无法弄清楚我缺少什么。

任何帮助都将不胜感激。

我有一个管理控制台应用程序可用服务的课程。

    public class FXLoginProvider
{
    private readonly IServiceCollection _svccoll;
    private UserManager<FXUser> _um = null;
    private SignInManager<FXUser> _sm = null;
    public UserManager<FXUser> UserMgr
    {
        get { return _um ?? (_um = _svccoll.BuildServiceProvider().GetService<UserManager<FXUser>>()); }
    }
    public SignInManager<FXUser> SignInMgr
    {
        get { return _sm ?? (_sm = _svccoll.BuildServiceProvider().GetService<SignInManager<FXUser>>()); }
    }
    public FXLoginProvider()
    {
        string s = "Data Source=.\SQLEXPRESS;Initial catalog=csNextGen;Integrated Security=True;TrustServerCertificate=True;ApplicationIntent=ReadWrite";
        _svccoll = new ServiceCollection();
        _svccoll.AddDbContext<FXDataContext>(options => { options.UseSqlServer(s); });
        _svccoll.AddIdentity<FXUser, FXUserRole>().AddDefaultTokenProviders();
        _svccoll.AddTransient<IUserStore<FXUser>, FXUserStore>();
        _svccoll.AddTransient<IRoleStore<FXUserRole>, FXRoleStore>();
        _svccoll.AddLogging();
        _svccoll.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }
}

然后在我的主要应用中...

class Program
{
    static void Main(string[] args)
    {
        try
        {
            FXUser uu = null;
            string sUsername = "user";
            string sPassword = "P$sSw0rrD#!";
            // create the service provider
            FXLoginProvider icp = new FXLoginProvider();
            // grab the sign in manager
            SignInManager<FXUser> sm1 = icp.SignInMgr;
            // fetch the user from the db, this works.
            uu = icp.UserMgr.FindByNameAsync(sUsername).Result;
            // update my security stamp, this works too
            sm1.UserManager.UpdateSecurityStampAsync(uu).GetAwaiter().GetResult();
            // I was receiving a Null context error, so I added a default context.
            sm1.Context = new DefaultHttpContext();
            var r = sm1.PasswordSignInAsync(sUsername, sPassword, false, false).GetAwaiter().GetResult();
            Console.WriteLine(r);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

,它总是抛出相同的例外:

值不能为null。 r n参数名称:提供商

我确实在stacktrace中看到了它在依赖项中丢下。ServiceProviderServiceExtensions(di.spse的源代码(,因为IserviceProvider为null;所以我想我缺少列表中的服务?

我能够找出我的实现问题。我的错误仅仅是我还没有正确填写默认的HTTP上下文。

 sm1.Context = new DefaultHttpContext();

应该是

 sm1.Context = new DefaultHttpContext() { RequestServices = icp._svccoll.BuildServiceProvider() };

注意:我也需要更改_svccoll的访问级别。

有了此更改,我可以使用SigninManager对我的后端数据库进行身份验证。

我已经战斗了几天,因此我很高兴分享我的解决方案(可以在Github上找到解决方案(。我希望这会有所帮助!

singinmanager依靠cookie,您不能在控制台应用中使用它。而不是使用usermanager&lt;>有一种方法来验证密码

相关内容

  • 没有找到相关文章

最新更新