servicestack,Asp.net Mvc,servicestack" /> servicestack,Asp.net Mvc,servicestack" />

Asp.net mvc 使用ASP.NET MVC站点和ServiceStack API进行身份验证

Asp.net mvc 使用ASP.NET MVC站点和ServiceStack API进行身份验证,asp.net-mvc,servicestack,Asp.net Mvc,servicestack,我正在使用ASP.NET MVC和使用ServiceStack的API开发一个网站 很快我想添加身份验证。该网站将至少有两种类型的用户“服务提供者”和“服务消费者”,尽管一个用户可以有多个角色 我愿意使用新的MVC标识,但我希望我使用的任何东西都能很好地用于servicestack API和MVC“页面”,它们不一定使用API,但应该根据登录显示不同的内容。我不想需要javascript进行登录/注销 我希望解决方案使用令牌,因为我没有在其他任何地方使用会话状态,但我愿意接受其他选项,前提是它们

我正在使用ASP.NET MVC和使用ServiceStack的API开发一个网站

很快我想添加身份验证。该网站将至少有两种类型的用户“服务提供者”和“服务消费者”,尽管一个用户可以有多个角色

我愿意使用新的MVC标识,但我希望我使用的任何东西都能很好地用于servicestack API和MVC“页面”,它们不一定使用API,但应该根据登录显示不同的内容。我不想需要javascript进行登录/注销

我希望解决方案使用令牌,因为我没有在其他任何地方使用会话状态,但我愿意接受其他选项,前提是它们可以在云提供商上水平扩展(用户下一个请求可能会转到后端的其他实例)

有人有理想解决方案的例子吗


(注意:我对外部托管的服务不感兴趣)。

ServiceStack的身份验证也可由外部ASP.NET Web框架使用,说明了如何:

public ActionResult登录(字符串用户名、字符串密码、字符串重定向=null)
{
if(ModelState.IsValid)
{
尝试
{
using(var authService=ResolveService)Live演示展示了使用标准MVC HTML表单调用此控制器的示例

然后,您的MVC控制器可以继承ServiceStackController以访问经过身份验证的用户会话和不同的ServiceStack提供程序,以下是与会话和身份验证相关的API:

public class ServiceStackController : Controller
{
    //...
    ISession SessionBag { get; set; }
    bool IsAuthenticated { get; set; }
    IAuthSession GetSession(bool reload = true);
    TUserSession SessionAs<TUserSession>();
    void ClearSession();
}
公共类ServiceStackController:控制器
{
//...
ISession会话包{get;set;}
布尔已验证{get;set;}
IAuthSession GetSession(bool reload=true);
TUserSession SessionAs();
void ClearSession();
}
启用OAuth提供程序
如果需要,您还可以选择直接回调ServiceStack服务或进一步回调mythz answer。我还需要知道用户是否在视图中经过身份验证,以及正常请求。执行上述操作时,IsAuthenticated不起作用。因此,我创建了一个CustomWebViewPage(要使用此选项,您必须在视图文件夹的Web.config中更改*pageBaseType=“Your.NameSpace.CustomWebViewPage”

公共抽象类CustomWebViewPage:WebViewPage
{
私人IServiceStackProvider _serviceStackProvider;
公共虚拟IServiceStackProvider服务堆栈提供程序
{
得到
{
返回\u serviceStackProvider??(\u serviceStackProvider=
新的ServiceStackProvider(新的AspNetRequest(base.Context,GetType().Name));
}
}
公共虚拟布尔值已验证
{
获取{return ServiceStackProvider.IsAuthenticated;}
}
}
公共抽象类CustomWebViewPage:WebViewPage
{
//与上述方法完全相同。。。

(我了解ServiceStack身份验证,并将其用于SPA API,但以前没有与ASP.NET MVC集成或对其进行标记化)我当然希望你能回答,我在这里提出了一个相关的问题:@Darren无法告诉你,从未使用过ASP.NET标识,因此不确定合适的集成策略是什么。我自己没有时间进行研发,但我会探索的一些方法包括一个定制的AuthProvider,该AuthProvider预计将在OnAuthentication c中通过MVC调用综上所述,如果不可能,另一种方法是手动保存ServiceStack会话中的
AuthUserSession
,您可能还需要手动设置ServiceStack的
ss id
/
ss pid
Cookie,因为标识基于OWIN而不是ASP.NET上下文,因此任何cookies ss集都可能会丢失e已忽略。如果您有3分钟的时间查看我在下面添加的内容,可能我不需要/不想要GetType().Name。@Darren没关系,OperationName基本上是元数据,用于标识请求DTO的名称,它不在视图中使用。
public class ServiceStackController : Controller
{
    //...
    ISession SessionBag { get; set; }
    bool IsAuthenticated { get; set; }
    IAuthSession GetSession(bool reload = true);
    TUserSession SessionAs<TUserSession>();
    void ClearSession();
}
public abstract class CustomWebViewPage : WebViewPage
{
    private IServiceStackProvider _serviceStackProvider;
    public virtual IServiceStackProvider ServiceStackProvider
    {
        get
        {
            return _serviceStackProvider ?? (_serviceStackProvider =
                new ServiceStackProvider(new AspNetRequest(base.Context, GetType().Name)));
        }
    }

    public virtual bool IsAuthenticated
    {
        get { return ServiceStackProvider.IsAuthenticated; }
    }
}

public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel>
{
    //EXACTLY the same as above method...