gpt4 book ai didi

c# - 使用现有数据库的 ServiceStack 身份验证

转载 作者:太空狗 更新时间:2023-10-29 23:00:39 25 4
gpt4 key购买 nike

我一直在研究 ServiceStack,并试图了解如何在具有现有数据库的服务上使用 BasicAuthentication。我想生成一个公钥(用户名)和 secret key (密码)并将其放入现有用户记录中。然后,用户会将其与他们的请求一起传递给 ServiceStack 端点。

我需要在 ServiceStack 堆栈中实现什么才能使其正常工作?

我查看了 IUserAuthRepository 和 CredentialsAuthProvider 基类,看起来我应该在现有数据库表的基础上实现 IUserAuthRepository。

我也在尝试弄清楚我应该实现什么才能使身份验证正常工作。我不会使用该服务来添加或更新用户对服务的访问权限,而是使用单独的 Web 应用程序。

非常感谢任何帮助和过去的经验。

最佳答案

针对现有数据库进行身份验证的示例(在本例中是通过 Umbraco/ASP.NET 成员(member)系统)。 1) 创建您的 AuthProvider(请原谅冗长的代码,请注意您不必也覆盖 TryAuthenticate,这样做是为了检查用户是否是特定 Umbraco 应用程序别名的成员):

using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Security;

using ServiceStack.Configuration;
using ServiceStack.Logging;
using ServiceStack.ServiceInterface;
using ServiceStack.ServiceInterface.Auth;
using ServiceStack.WebHost.Endpoints;

using umbraco.BusinessLogic;
using umbraco.providers;

public class UmbracoAuthProvider : CredentialsAuthProvider
{

public UmbracoAuthProvider(IResourceManager appSettings)
{
this.Provider = "umbraco";
}

private UmbracoAuthConfig AuthConfig
{
get
{
return EndpointHost.AppHost.TryResolve<UmbracoAuthConfig>();
}
}

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
{
ILog log = LogManager.GetLogger(this.GetType());
var membershipProvider = (UsersMembershipProvider)Membership.Providers["UsersMembershipProvider"];

if (membershipProvider == null)
{
log.Error("UmbracoAuthProvider.OnAuthenticated - NullReferenceException - UsersMembershipProvider");
session.IsAuthenticated = false;
return;
}

MembershipUser user = membershipProvider.GetUser(session.UserAuthName, false);

if (user == null)
{
log.ErrorFormat(
"UmbracoAuthProvider.OnAuthenticated - GetMembershipUser failed - {0}", session.UserAuthName);
session.IsAuthenticated = false;
return;
}

if (user.ProviderUserKey == null)
{
log.ErrorFormat(
"UmbracoAuthProvider.OnAuthenticated - ProviderUserKey failed - {0}", session.UserAuthName);
session.IsAuthenticated = false;
return;
}

User umbracoUser = User.GetUser((int)user.ProviderUserKey);

if (umbracoUser == null || umbracoUser.Disabled)
{
log.WarnFormat(
"UmbracoAuthProvider.OnAuthenticated - GetUmbracoUser failed - {0}", session.UserAuthName);
session.IsAuthenticated = false;
return;
}

session.UserAuthId = umbracoUser.Id.ToString(CultureInfo.InvariantCulture);
session.Email = umbracoUser.Email;
session.DisplayName = umbracoUser.Name;
session.IsAuthenticated = true;
session.Roles = new List<string>();
if (umbracoUser.UserType.Name == "Administrators")
{
session.Roles.Add(RoleNames.Admin);
}

authService.SaveSession(session);
base.OnAuthenticated(authService, session, tokens, authInfo);
}

public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
{
ILog log = LogManager.GetLogger(this.GetType());
var membershipProvider = (UsersMembershipProvider)Membership.Providers["UsersMembershipProvider"];

if (membershipProvider == null)
{
log.Error("UmbracoAuthProvider.TryAuthenticate - NullReferenceException - UsersMembershipProvider");
return false;
}

if (!membershipProvider.ValidateUser(userName, password))
{
log.WarnFormat("UmbracoAuthProvider.TryAuthenticate - ValidateUser failed - {0}", userName);
return false;
}

MembershipUser user = membershipProvider.GetUser(userName, false);

if (user == null)
{
log.ErrorFormat("UmbracoAuthProvider.TryAuthenticate - GetMembershipUser failed - {0}", userName);
return false;
}

if (user.ProviderUserKey == null)
{
log.ErrorFormat("UmbracoAuthProvider.TryAuthenticate - ProviderUserKey failed - {0}", userName);
return false;
}

User umbracoUser = User.GetUser((int)user.ProviderUserKey);

if (umbracoUser == null || umbracoUser.Disabled)
{
log.WarnFormat("UmbracoAuthProvider.TryAuthenticate - GetUmbracoUser failed - {0}", userName);
return false;
}

if (umbracoUser.UserType.Name == "Administrators"
|| umbracoUser.GetApplications()
.Any(app => this.AuthConfig.AllowedApplicationAliases.Any(s => s == app.alias)))
{
return true;
}

log.WarnFormat("UmbracoAuthProvider.TryAuthenticate - AllowedApplicationAliases failed - {0}", userName);

return false;
}
}

public class UmbracoAuthConfig
{

public UmbracoAuthConfig(IResourceManager appSettings)
{
this.AllowedApplicationAliases = appSettings.GetList("UmbracoAuthConfig.AllowedApplicationAliases").ToList();
}

public List<string> AllowedApplicationAliases { get; private set; }

}

2) 通过常规的 AppHost Configure 方法注册提供者:

    public override void Configure(Container container)
{
// .... some config code omitted....

var appSettings = new AppSettings();
AppConfig = new AppConfig(appSettings);
container.Register(AppConfig);

container.Register<ICacheClient>(new MemoryCacheClient());

container.Register<ISessionFactory>(c => new SessionFactory(c.Resolve<ICacheClient>()));

this.Plugins.Add(
new AuthFeature(
// using a custom AuthUserSession here as other checks performed here, e.g. validating Google Apps domain if oAuth enabled/plugged in.
() => new CustomAuthSession(),
new IAuthProvider[] { new UmbracoAuthProvider(appSettings)
}) {
HtmlRedirect = "/api/login"
});

}

3) 现在可以对现有的 Umbraco 数据库进行身份验证 @ yourapidomain/auth/umbraco,使用 Umbraco 管理用户/访问 API。无需实现额外的用户 key / secret 或 BasicAuthentication,除非您真的想要....

关于c# - 使用现有数据库的 ServiceStack 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14326502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com