我对 ServiceStack 很陌生,所以如果我提出任何明显的问题,请原谅我的无知。
我有一个网站已经使用 dotnetopenauth 使用在线提供的普通示例对用户进行身份验证。有一个登录按钮,该按钮发布到此方法:
Public Sub ExecuteGoogleLogin()
Dim Url As String = "https://www.google.com/accounts/o8/id"
Dim OpenID As New OpenIdRelyingParty
Dim HostedMeta As New HostMetaDiscoveryService() With {.UseGoogleHostedHostMeta = True}
Dim ReturnUrl As String = Request.Url.ToString
OpenID.DiscoveryServices.Insert(0, HostedMeta)
Dim builder As New UriBuilder(ReturnUrl)
Dim fetch As New FetchRequest()
Dim Req = OpenID.CreateRequest(Url, Realm.AutoDetect, builder.Uri)
fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email)
fetch.Attributes.AddRequired(WellKnownAttributes.Name.First)
fetch.Attributes.AddRequired(WellKnownAttributes.Name.Last)
Req.AddExtension(fetch)
Req.RedirectToProvider()
End Sub
然后它将重定向回将检查响应的页面,例如
Private Sub CheckOpenIDResponse()
Dim Rp As New OpenIdRelyingParty
Dim Resp = Rp.GetResponse()
Dim Subsc As Subscriber
Select Case Resp.Status
Case AuthenticationStatus.Authenticated
Dim Fetch = Resp.GetExtension(Of FetchResponse)()
Email = Fetch.GetAttributeValue(WellKnownAttributes.Contact.Email)
....
相当标准并且工作正常(目前仅支持谷歌)但它可以工作。我的 AppHost 工作正常,一些测试 Dto 按预期工作,现在只需要实现身份验证。所以我的问题是:
- 如何使用 servicestack 的身份验证类(GoogleOpenIdOAuthProvider 等)将此准系统代码转换为工作?并彻底摆脱 dotnetopenauth。或者...
- 在 ServiceStack 中,想办法使用 dotnetopenauth(或上面的代码)来实现身份验证。
也许我在 SS 文档中遗漏了一些明显的东西,但对于我的生活,我似乎无法弄清楚如何将它们放在一起。
为了从调用页面获取会话,我将我的用户对象(称为订阅者)包装在 CustomUserSession 中。
Dim Ahost = ServiceStack.WebHost.Endpoints.EndpointHost.AppHost
Dim Key = ServiceStack.ServiceInterface.SessionFeature.GetSessionKey()
Dim Sess As CustomUserSession = Ahost.TryResolve(Of ServiceStack.CacheAccess.ICacheClient)().[Get](Of CustomUserSession)(Key)
然后从这里我按照我的意愿使用会话。